You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何在数组中存储带空格全名 解决输入后程序异常退出问题

问题根因
  • cin >> 读取输入时默认遇到空格、换行、制表符等空白字符就会终止读取,本身就不支持读取带空格的全名。
  • 用cin >>读取数字类内容(比如学生总数、学号)后,输入时敲的回车对应的换行符会残留在输入缓冲区里,后续读取操作如果没处理这个残留,会直接读到空内容,逻辑错乱就会导致程序异常退出。
  • 你定义的char name[100][10000]最多只能存储100个学生的姓名,如果输入的学生数量大于100,会直接触发数组越界,造成程序崩溃退出。
  • 你代码里声明的user2、temp变量全程没有使用,属于冗余代码,虽然不会直接引发报错,但建议清理。
修复方案
  1. 所有数字类输入完成后,主动清空输入缓冲区里残留的换行符,避免干扰后续整行读取。
  2. 读取带空格的姓名时不要用cin >>,替换为cin.getline()方法,该方法会读取到换行符才终止,可以完整获取带空格的全名。
  3. 增加输入合法性校验,确保输入的学生数量不超过数组的存储上限,避免数组越界。

修复后的可运行代码如下:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:39:18