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

C++使用cin无法连续接收输入,按回车后出现异常问题求助

问题根本原因

核心问题出在你用uint8_t类型接收年龄输入时的类型不匹配:

  • uint8_t在绝大多数编译器(包括你用的MinGW GCC)中本质是unsigned char的类型别名,cin对char类型的处理逻辑是读取单个字符的ASCII值,而不是把输入的数字串转为整数。
    举个例子:你输入年龄18敲回车,cin只会把第一个字符'1'(ASCII值为49)赋值给age变量,剩下的字符'8'和换行符会残留在输入缓冲区里。后面执行cin >> gender的时候,会直接读取缓冲区里残留的'8',不会等待你新输入,自然就出现了连续跳步、输入异常的情况。

修复方案

方法1:临时用int接收年龄再转存

把Add_SV方法里接收年龄的逻辑改成用int类型中转:

cout << "Nhap tuoi cua sinh vien: ";
int age_input; // 先用int接收数字输入
cin >> age_input;
uint8_t age = static_cast<uint8_t>(age_input); // 再转成uint8_t存到结构体里

方法2:把结构体中age的类型改成int

如果对内存没有极致要求,直接把SV结构体里的age类型从uint8_t改成int,完全避免类型匹配问题:

typedef struct SV {
    char name[50];
    int age; // 替换uint8_t
    char gender;
    float average;
    float math;
    float literature;
    float chemical;
    float physical;
    float biological;
} SV_Info;

额外注意事项

  • 你当前Add_SV方法里读取的所有临时变量都没有存入类成员sv_info数组,后续调用会拿不到存储的学生信息,需要补充赋值逻辑。
  • 用cin >> char数组的时候如果输入长度超过数组容量会触发内存越界,建议用cin.getline或者直接用std::string存储姓名、性别这些字符串类型数据。
  • 你当前SV_Manager类没有写析构函数释放new出来的sv_info数组,会存在内存泄漏问题,建议补充析构函数,或者直接用std::vector<SV_Info>替代动态数组,自动管理内存。

内容的提问来源于stack exchange,提问作者NeonLightions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:54:02