最安全的数组输入方式是用std::vector配合for循环:已知数量时先resize再读,未知数量时用while(cin>>x)动态添加;需处理cin失败后的clear和ignore,避免死循环。

for循环读取数组输入时,下标越界是最常见错误
直接用 for (int i = 0; i 读 <code>int arr[n],最后一步必然访问 arr[n] —— 这是未定义行为,轻则值错乱,重则程序崩溃。C++ 数组索引从 0 开始,合法范围是 0 到 n-1,所以循环条件必须是 i 。
- 声明数组前,先确认输入长度
n(不能用变量长度数组 VLA,除非编译器支持且你明确知道风险) - 推荐用
std::vector<int> arr(n)</int>替代裸数组,避免栈溢出和尺寸硬编码 - 读入时优先用
std::cin >> arr[i],别混用gets或scanf(类型不匹配易出错)
用 std::vector + for 循环读输入更安全也更常用
裸数组在读取前就得知道大小,而 vector 可以边读边扩容。但注意:如果已知元素个数,先 reserve 或 resize 再读,效率更高,避免多次内存重分配。
- 已知数量:
int n; std::cin >> n;<br>std::vector<int> arr(n);<br>for (int i = 0; i std::cin >> arr[i];<br>}</int>
- 未知数量(按行读直到 EOF):
std::vector<int> arr;<br>int x;<br>while (std::cin >> x) {<br> arr.push_back(x);<br>}</int> - 混入空格或换行不影响
>>提取,它会自动跳过空白符
cin 失败后不清理状态,后续读取全卡住
用户输了个字母进本该读整数的循环,std::cin >> x 失败,failbit 被置位,之后所有输入操作都直接返回,循环变成死循环或跳过。必须手动恢复状态。
- 检查失败:用
if (!(std::cin >> x))判断 - 恢复状态:
std::cin.clear()清标志位 - 丢弃坏输入:
std::cin.ignore(1024, '\n')(忽略最多 1024 字符直到换行) - 否则,一次输入错误会导致整个数组读取逻辑瘫痪
for-range 循环不能直接读输入,但可配合迭代器用
for (auto& x : arr) 是只读或修改已有元素的写法,不能用于“把新值塞进容器”。想用范围 for 实现输入,得先让容器有空间。
- 错误写法:
for (auto& x : arr) std::cin >> x;—— 如果arr为空,循环体根本不会执行 - 正确前提:
arr.resize(n)或arr.assign(n, 0)后再 range-for - 等价于下标 for,但少一个计数变量;调试时不如下标方式直观查索引
vector 配 for (int i = 0; i ,简单、可控、不易漏状态清理。边界和流状态这两处,一不留神就卡半天。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











