最简写法是用两层for循环配合cin逐个读取,如int arr3; for(int i=0; i arri; cin>>自动跳过空白符,但需确保输入流无残留换行或错误状态。

用 cin 循环录入二维数组的最简写法
直接用两层 for 循环配合 cin 即可,C++ 原生数组不支持整体输入,必须逐个元素读取。关键点在于下标顺序和输入缓冲区是否干净——尤其当之前用过 cin >> 读取字符串或字符后,容易卡在换行符上。
示例(3 行 4 列):
int arr[3][4];
for (int i = 0; i > arr[i][j];
}
}
- 输入时用空格或换行分隔数字均可,
cin >>会自动跳过空白符 - 不要在循环里加
cin.ignore(),除非你刚读过string或char并残留了\n - 如果用户输错(比如输了个字母),
cin会进入失败状态,后续所有>>都无效——需手动恢复:cin.clear(); cin.ignore(1000, '\n');
用 vector<vector>></vector> 录入更安全
原生数组大小固定,而 vector 可动态确定行列数,避免硬编码,也更容易处理异常输入。
常见写法:
int rows, cols;
cin >> rows >> cols;
vector<vector>> mat(rows, vector<int>(cols));
for (int i = 0; i > mat[i][j];
}
}</int></vector>
- 先读
rows和cols,再构造二维vector,比预分配大数组更省内存 -
vector的[]不做越界检查,但你可以用at(i).at(j)触发异常(调试时有用) - 如果输入行数不足,
cin会阻塞等待;若超量,多余数据留在缓冲区,可能影响后续读取
遇到 cin 卡住或跳过输入怎么办
典型现象:第一次循环正常,第二行开始直接跳过,或者某次输入后程序“假死”。大概率是输入流中残留了换行符或非法字符。
- 用
cin.peek() == '\n'检查缓冲区头部是否为换行符 - 读完一行数字后想清空到行尾,用
cin.ignore(numeric_limits<streamsize>::max(), '\n');</streamsize>(需#include <limits></limits>) - 如果用户混合输入数字和字符串(如先输
3 4,再输"matrix"),cin >>无法识别字符串里的空格,建议统一用getline+ 字符串解析
性能和兼容性提醒
纯 cin >> 在大量数据(如 10⁴×10⁴)下明显慢于 scanf,且不支持格式化跳过字段。但若只是 OJ 小规模输入或教学场景,无需替换。
- 关闭同步后可提速:
ios::sync_with_stdio(false); cin.tie(nullptr);(注意:之后不能混用scanf/printf) - Windows 下控制台粘贴多行输入时,确保结尾有换行,否则最后一行可能读不全
- g++ 编译时默认启用
-std=gnu++17,vector初始化语法无兼容问题;但旧编译器(如 C++98)不支持vector<vector>> mat(rows, vector<int>(cols))</int></vector>这种写法
真正容易被忽略的是输入错误后的流状态管理——一次失败不处理,后面所有 cin 都静默失效,debug 时很难联想到是流状态没清。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











