C++中如何循环使用getline函数?调用被跳过该如何解决?
问题原因
- 核心是输入缓冲区残留换行符导致的:
cin >> age只会读取输入的整数内容,不会处理输入完成后按下回车对应的\n字符,这个换行符会一直留在输入缓冲区中。 - 下一轮循环执行
getline(cin, name)时,getline默认遇到\n就停止读取,直接把缓冲区里残留的\n当成输入结束标识,因此会读取到空字符串,看起来就像跳过了这行代码。
解决方法
在cin >> age执行完成后,手动清空输入缓冲区中残留的所有字符直到遇到换行符为止,具体修改如下:
首先需要新增引入<limits>头文件,用于获取输入缓冲区的最大长度:
#include <iostream> #include <string> #include <limits> // 新增头文件 using namespace std; int main() { string name; int age; while(true) { cout << "Enter your name: "; getline(cin, name); cout << "Enter your age: "; cin >> age; cout << "Age: " << age << "\tName: " << name << "\n\n"; // 新增:清空输入缓冲区残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } }
如果你的使用场景可以确定缓冲区只会残留一个换行符,也可以简化为cin.ignore();,上面的写法兼容性更强,能处理输入年龄时多输入了其他多余字符的场景。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

