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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:15:03