C++ getline未按预期运行,跳过用户输入问题求助
C++ 混合使用cin和getline导致输入跳过问题解决方案
问题根因
这是C++标准输入中cin >>和getline混用的经典缓冲区残留问题:
cin >>读取整型变量时,只会提取输入流中符合数字格式的内容,用户输入完数字按下的换行符\n会留在输入缓冲区中getline默认以换行符作为结束标识,遇到缓冲区残留的换行符时会直接返回空字符串,因此你输入完第一部电影的时长后,下一行的getline(cin, movie2.title)直接读取了残留的换行符,表现为直接跳过输入环节。
解决方案
最常用的解决方法是每次使用cin >>读取完数值类型后,手动清空输入缓冲区的残留换行符:
- 首先在头文件区域引入
<limits>头文件 - 每次
cin >>执行完成后,添加如下代码清空缓冲区:
// 清空输入缓冲区中直到换行符为止的所有内容 cin.ignore(numeric_limits<streamsize>::max(), '\n');
修改后的业务代码示例
#include <iostream> #include <string> #include <limits> // 新增头文件 using namespace std; struct MovieData { string title, director; int yearReleased, runningTime; }; int main() { MovieData movie1; MovieData movie2; //Get title cout << "Enter the title of movie 1: "; getline(cin, movie1.title); //Get director cout << "Enter the name of the director 1: "; getline(cin, movie1.director); //Get year released cout << "Enter the year movie 1 was released: "; cin >> movie1.yearReleased; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空缓冲区 //Get running time cout << "Enter the duration of movie 1 in minutes: "; cin >> movie1.runningTime; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空缓冲区,解决第二部电影标题输入被跳过的问题 //Get title 2 cout << "Enter the title of movie 2: "; getline(cin, movie2.title); //Get director 2 cout << "Enter the name of the director 2: "; getline(cin, movie2.director); //Get year released 2 cout << "Enter the year movie 2 was released: "; cin >> movie2.yearReleased; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 后续如果还有输入也需要加 //Get running time 2 cout << "Enter the duration of movie 2 in minutes: "; cin >> movie2.runningTime; cin.ignore(numeric_limits<streamsize>::max(), '\n'); return 0; }
只需要简单处理单个换行符的场景下,也可以直接用cin.ignore()代替上面的完整写法,完整写法的兼容性更强,能处理用户输入数字后额外输入空格、Tab等多余字符的场景。
内容的提问来源于stack exchange,提问作者Chance
相关产品推荐
相关产品推荐

