为何无法用循环读取char数组输入?代码异常问题咨询
问题分析与解答
代码核心问题与cin行为解释
先看你提供的代码:
#include<iostream> #include<string> using namespace std; int main() { int size; char str[size]; cin>>size; for(int i=0; i<size; i++) { cin>>str[i]; } return 0; }
你期望输入size=10时读取10个输入,但实际行为不符合预期,根源和解决方式如下:
1. 数组定义顺序错误导致的未定义行为
C++标准不支持变长数组(VLA)(仅部分编译器如GCC将其作为扩展支持),更严重的是你在定义char str[size]时,size还未被初始化,此时size是随机的垃圾值,数组大小完全不确定。这会导致:
- 若数组实际大小小于10,循环写入会越界破坏内存,引发程序崩溃、输入读取异常等不可预测的行为;
- 若数组实际大小远大于10,后续可能会读取到额外的输入内容,和你预期的10次读取不符。
正确的写法是先读取size,再创建动态数组(推荐用标准库的vector替代非标准变长数组):
#include<iostream> #include<string> #include<vector> using namespace std; int main() { int size; cin>>size; vector<char> str(size); // 标准C++动态数组,大小由size决定 for(int i=0; i<size; i++) { cin>>str[i]; } return 0; }
2. cin的输入行为说明
修正数组问题后,cin>>str[i]的行为是明确的:
>>运算符会自动跳过所有空白字符(空格、换行、制表符等),只读取非空白的单个字符;- 只要你输入的非空白字符数量足够,循环会准确读取
size个字符,不会多读取。你之前遇到的“读取多个输入”,本质是数组大小随机导致的内存异常,并非cin本身的问题。
内容的提问来源于stack exchange,提问作者Prakhar Arora
相关产品推荐
相关产品推荐

