C++如何在数组中存储带空格全名 解决输入后程序异常退出问题
问题根因
cin >>读取输入时默认遇到空格、换行、制表符等空白字符就会终止读取,本身就不支持读取带空格的全名。- 用
cin >>读取数字类内容(比如学生总数、学号)后,输入时敲的回车对应的换行符会残留在输入缓冲区里,后续读取操作如果没处理这个残留,会直接读到空内容,逻辑错乱就会导致程序异常退出。 - 你定义的
char name[100][10000]最多只能存储100个学生的姓名,如果输入的学生数量大于100,会直接触发数组越界,造成程序崩溃退出。 - 你代码里声明的
user2、temp变量全程没有使用,属于冗余代码,虽然不会直接引发报错,但建议清理。
修复方案
- 所有数字类输入完成后,主动清空输入缓冲区里残留的换行符,避免干扰后续整行读取。
- 读取带空格的姓名时不要用
cin >>,替换为cin.getline()方法,该方法会读取到换行符才终止,可以完整获取带空格的全名。 - 增加输入合法性校验,确保输入的学生数量不超过数组的存储上限,避免数组越界。
修复后的可运行代码如下:
#include <iostream> #include <limits> using namespace std; int main() { const int MAX_STUDENT = 100; int user1; char name[MAX_STUDENT][10000]; int num[10000]; cout << "Number of students: "; cin >> user1; // 校验输入的学生数是否超过数组容量 if (user1 > MAX_STUDENT || user1 <= 0) { cout << "输入的学生数量不合法,程序退出" << endl; return 1; } // 清空读取学生数后残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "\n"; for(int i = 0; i < user1; i++) { cout << "Students No." << i + 1; cout << "\nName: "; // 读取整行姓名,支持包含空格的输入 cin.getline(name[i], 10000); cout << "Num: "; cin >> num[i]; // 清空读取学号后残留的换行符,避免下一轮循环读姓名出错 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "\n"; } // 此处可添加后续业务逻辑,比如信息打印、排序等 return 0; }
补充:如果不想用定长字符数组,也可以用C++的
string类型存储姓名,配合getline(cin, name_str)读取整行,不需要手动指定长度,能避免字符数组溢出的问题,写法更简洁。
内容的提问来源于stack exchange,提问作者Tommy Basril
相关产品推荐
相关产品推荐

