编程天地
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/