C++链表员工管理系统输入死循环及数据显示异常问题咨询
C++员工管理系统问题修复方案
问题1:输入员工全名时程序陷入死循环
错误原因
执行cin>>choice读取菜单选项后,输入缓冲区会残留一个换行符,后续调用getline(cin,name)时会直接读取到这个换行符,得到空字符串。如果此时输入带空格的全名,内容会被后续的cin>>id接收,而id是int类型,字符串无法匹配int类型会导致cin进入fail状态,后续所有输入操作都失效,程序进入死循环。
修复方案
每次执行cin>>读取数值类型后,清空输入缓冲区残留的换行符:
- 在
cin>>choice后添加一行忽略残留字符的代码:
cin>>choice; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 新增这行,清空到换行符为止的所有残留内容
- 提前引入头文件
<limits>才能使用numeric_limits。
问题2:查询、显示员工信息输出随机乱码
错误原因
Employee类的构造函数、所有属性setter方法的赋值逻辑完全写反:将成员变量的值赋值给了参数,而不是把参数的值赋值给成员变量,导致所有员工属性都没有被正确赋值,读取的是内存里的随机垃圾值,所以输出乱码。
修复方案
修正Employee类的构造函数和setter的赋值顺序:
// 修正后的构造函数 Employee (string n, int id, double s){ name = n; // 原代码写反为n = name ID = id; // 原代码写反为id = ID Salary = s; // 原代码写反为s = Salary this->next = NULL; } // 修正后的setters void setName(string n){ name = n; // 原代码写反为n = name } void setID(int id){ ID = id; // 原代码写反为id = ID } void setSalary(double s){ Salary = s; // 原代码写反为s = Salary }
修正后所有员工属性就可以正常赋值、读取,不会再输出乱码。
额外优化建议
当前代码直接引入cpp文件的写法不符合C++工程规范,建议把类定义放到.h头文件,类实现放到独立的.cpp文件,编译时链接所有cpp文件即可。
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

