如何以换行符为分隔符输入字符串数组?代码循环无法退出求助
解决你的C++输入循环退出问题
嘿,我来帮你排查下代码里的问题!你的循环没法退出,还有几个隐藏的bug,咱们一步步拆解:
核心问题分析
cin >>会跳过空白字符cin >>运算符默认会忽略所有空白(包括换行、空格、制表符),所以你永远没法通过它读到换行符,strcmp(a[i],"\n")这个条件永远不可能成立,循环自然停不下来。循环逻辑错误,访问未初始化内存
你在do块里先执行cin>>a[i]; i++;,然后while条件里用strcmp(a[i],"\n")——这时候a[i]是还没被赋值的内存,全是随机垃圾值,完全不是你输入的内容,逻辑彻底走偏了。for循环的笔误
最后输出的循环里,你写的是for(int j=0;j<i;i++),这里应该是j++而不是i++,不然会直接导致数组越界或者死循环。
修复后的代码方案
推荐用 getline() 来读取整行输入,它能正确识别换行符,还能读取带空格的行。这里给你两个版本:
版本1:用std::string更简洁(推荐)
#include <iostream> #include <string> #include <cstring> using namespace std; int main() { int i = 0; char a[100][100]; string line; // 读取每行,直到输入空行(直接按回车)退出 while (getline(cin, line)) { if (line.empty()) { break; } // 将string转存到char数组,注意防止溢出 strncpy(a[i], line.c_str(), 99); a[i][99] = '\0'; // 确保字符串有结束符 i++; if (i >= 99) break; // 避免数组越界 } // 输出所有输入内容 for (int j = 0; j < i; j++) { cout << a[j] << endl; } return 0; }
版本2:纯char数组实现
如果你坚持用char数组,可以用cin.getline():
#include <iostream> #include <cstring> using namespace std; int main() { int i = 0; char a[100][100]; do { // 读取整行到a[i],最多99个字符+结束符 cin.getline(a[i], 100); // 如果是空行(直接回车),退出循环 if (strlen(a[i]) == 0) { break; } i++; } while (i < 99); // 限制最大行数,防止数组越界 // 输出内容 for (int j = 0; j < i; j++) { cout << a[j] << endl; } return 0; }
关键说明
- 用
getline()可以完整读取用户输入的每一行,包括空格,直到遇到换行符。 - 加入了数组越界保护,避免输入超过100行导致内存溢出。
- 空行判断(直接按回车)作为退出条件,符合你的需求。
内容的提问来源于stack exchange,提问作者Great Person
相关产品推荐
相关产品推荐

