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
相关产品推荐
相关产品推荐

