编程天地

Last updated on April 26, 2025 pm

ACM模式

ACM模式,是需要处理输入和输出的模式,与Leetcode的核心代码模式不同。下面列出一些常用的输入输出读取函数:

  • cin:跳过前导空白(空格、制表符、换行符等),停在下一个空白字符前(不消耗)

  • getline(...):读取整行(包括空格),以换行符结束,且消耗换行符

  • getchar():来源于C标准库函数,读取一个字符(返回int,不跳过空白字符)

  • cin.get():来源于C++的iostream库,读取单个字符(不跳过空白字符)

  • cin.ignore():来源于C++的iostream库,默认忽略(跳过)输入流中的一个字符,可以传参控制跳过的字符个数

混合使用 cin >>getline():cin提取一个字符后,输入流中可能残留换行符(CR回车+LF换行),这时getline会读取空行,此时需用 cin.ignore() 或 cin.get() 或 getchar() 清除紧随其后的换行符。

读取二维数据

输入二维数组,首行分别是行和列,其余行是数组元素,元素是字符串,按空格分隔:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main() {
    // 通用逻辑:stringstream + getline
    int m, n;
    cin >> m >> n;  // 获取行数和列数
    cin.ignore();
    vector<vector<string>> matrix(m, vector<string>(n));
    for (int i = 0; i < m; ++i) {
        string line, val;
        getline(cin, line);  // 读取一行,第二个参数只能是string类型
        stringstream ss(line);  // 用line初始化字符串流对象ss
        int j = 0;
        while (ss >> val && j < n) {  // j<n是为了防止越界(逗号多于n个)
            matrix[i][j++] = val;
        }
    }
    ...
}

输入二维数组,首行分别是行和列,其余行是数组元素,元素是整数,以逗号分隔:

int m, n;
cin >> m >> n;
cin.ignore();
vector<vector<int>> matrix(m, vector<int>(n, 0));  // 元素全初始化为0
for (int i = 0; i < m; i++) {
    string line, token;
    getline(cin, line);
    stringstream ss(line);
    int j = 0;
    // stringstream + getline,从 ss 按分隔符 ',' 分割读取
    while (getline(ss, token, ',') && j < n) {
        matrix[i][j++] = stoi(token);  // 字符串转为int
    }
}

输入二维数组,元素是整数,按空格分隔,可以用简易写法:

int m, n;
cin >> m >> n;
vector<vector<int>> matrix(m, vector<int>(n));  //数字,处理字符和字符串也是一样的逻辑
for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        cin >> matrix[i][j];
    }
}

读取一维数据

一维数组的处理就很简单了:

// 终端输入非固定大小的一维数组,以空格分隔
vector<int> nums;
int n;
while (cin >> n) {
    nums.push_back(n);
    // 适用于输入格式规范的情况,最后的元素紧跟换行符表示结束
    if (cin.get() == '\n') {
        break;
    }
}

// 通用逻辑读取以空格分隔的一行数据
vector<int> nums;
string line;
getline(cin, line);  //读取整行
stringstream ss(line);  //字符串流对象
int n;
while (ss >> n) {  //直接从流中读取数字(自动跳过前导空白字符)
    nums.push_back(n);
}

// 读取以特殊字符(逗号)分隔的一行数据
vector<int> nums;   
string input;
getline(cin, input);
stringstream ss(input);
string str;
while (getline(ss, str, ',')) {
    int n = stoi(str);
    nums.push_back(n);
}

输出小数

按指定的输出格式输出小数:

float fnum = 2.5;
double dnum = 3.14159;

// 输出格式为固定小数,保留2位小数
printf("%.2f\n", fnum);  //2.50

// 先设置:fixed(固定小数格式),再设置精度为:2(保留两位小数),然后输出数据
cout << fixed << setprecision(2) << "float num: " << fnum << endl;  //2.50

// 保留3位小数,格式仅当前调用语句有效
printf("%.3f\n", dnum);  //3.142

// 输出固定小数,一次设置后持久生效
cout << "double num: " << dnum << endl;  //3.14

// 重新指定小数的输出格式
cout << fixed << setprecision(3) << "double num: " << dnum << endl;  //3.142

使用setprecision函数时,需要包含头文件:<iomanip>(manipulators),这是控制输入输出格式的流操作符。


编程天地
https://afly36-swordsman.github.io/2025/04/25/Programming05/
Author
Zenitsu
Posted on
April 25, 2025
Updated on
April 26, 2025