C++如何正确实现用户输入提示,解决第二个提问无法接收输入的问题
问题原因
第二次输入无响应是C++标准输入缓冲区的遗留换行符导致的:
- 执行
cin >> annualraise读取浮点型数据时,只会提取你输入的数字本身,你按下回车产生的\n换行符会留在输入缓冲区中 - 后续执行
getline(cin, theSurname)时,会默认读到换行符就结束,所以直接读取到了缓冲区里遗留的空内容,看起来就像没有触发输入一样 - 调换两个输入顺序能正常运行的逻辑也和这个特性相关:先调用getline的时候输入缓冲区是空的,不会有遗留换行符干扰,后续的
cin>>本身会自动跳过开头的空白字符(包括换行、空格),所以也不会受之前getline遗留的换行影响
修复方案
只需要在cin >> annualraise之后,加上一行代码清空输入缓冲区的遗留换行符即可。
基础适配写法:
cin >> annualraise; // 新增这行,忽略缓冲区中剩余的1个换行符 cin.ignore();
如果要适配输入数字后多打了空格、制表符的场景,可以用更稳妥的写法,忽略所有字符直到遇到换行符:
// 引入头文件 #include <limits> // 写入到cin读取数字的逻辑之后 cin.ignore(numeric_limits<streamsize>::max(), '\n');
修复后主函数关键代码示例
//为两位员工设置固定涨薪比例 cout << "\nEnter a percent raise: "; double annualraise; cin >> annualraise; // 清空输入缓冲区遗留的空白字符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); e1.setRaise(annualraise), e2.setRaise(annualraise); cout << "Employee e1: " << e1.getName() << ", " << e1.getSurname() << ", " << e1.getSalary() << endl; cout << "Employee e2: " << e2.getName() << ", " << e2.getSurname() << ", " << e2.getSalary() << endl; //修改Jane的姓氏为Doe cout << "\nEnter a new surname: "; string theSurname; getline(cin, theSurname); e2.setSurname(theSurname); cout << "Employee e2: " << e2.getName() << ", " << e2.getSurname() << ", " << e2.getSalary() << endl;
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

