C++程序中getline函数跳过用户输入的问题求助
C++程序输入跳过问题的原因及解决方法
问题原因
使用cin >> age读取整数时,输入完成后按下的回车键会留下一个换行符\n在输入缓冲区中。后续调用getline(cin, name)时,getline会将这个残留的换行符视为输入结束,直接读取到空字符串,导致姓名输入被跳过。
解决方法
方法一:清除输入缓冲区的残留换行符
在每次使用cin读取整数后,调用cin.ignore()忽略缓冲区中直到换行符的所有字符。需要包含<limits>头文件来使用numeric_limits。
修改后的代码示例:
#include <iostream> #include <limits> using namespace std; int main(){ string name1, name2, name3, n1, n2, n3; int age1, age2, age3; cout << "Who Is The First Student?"<< endl; getline(cin, name1); cout << "What is " << name1<< "'s Age?"<< endl; cin >> age1; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清除缓冲区的换行符 cout << "Who Is The Second Student?"<< endl; getline(cin, name2); cout << "What is " << name2<< "'s Age?"<< endl; cin >> age2; cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Who Is The Third Student?"<< endl; getline(cin, name3); cout << "What is " << name3<< "'s Age?"<< endl; cin >> age3; cin.ignore(numeric_limits<streamsize>::max(), '\n'); n1 = name1.substr(2, name1.size() -3); n2 = name2.substr(2, name2.size() -3); n3 = name3.substr(2, name3.size()-3); cout << "Name Age Modified"<<endl; cout << name1<< " "<<age1<<" "<<n1<<endl; cout << name2<< " "<<age2<<" "<<n2<<endl; cout << name3<< " "<<age3<<" "<<n3<<endl; return 0; }
方法二:统一使用getline读取所有输入
不再混合使用cin和getline,而是用getline读取年龄的字符串,再通过stoi()转换为整数。这种方法避免了缓冲区残留问题,逻辑更统一。
修改后的代码示例:
#include <iostream> using namespace std; int main(){ string name1, name2, name3, n1, n2, n3; int age1, age2, age3; string age_str; cout << "Who Is The First Student?"<< endl; getline(cin, name1); cout << "What is " << name1<< "'s Age?"<< endl; getline(cin, age_str); age1 = stoi(age_str); cout << "Who Is The Second Student?"<< endl; getline(cin, name2); cout << "What is " << name2<< "'s Age?"<< endl; getline(cin, age_str); age2 = stoi(age_str); cout << "Who Is The Third Student?"<< endl; getline(cin, name3); cout << "What is " << name3<< "'s Age?"<< endl; getline(cin, age_str); age3 = stoi(age_str); n1 = name1.substr(2, name1.size() -3); n2 = name2.substr(2, name2.size() -3); n3 = name3.substr(2, name3.size()-3); cout << "Name Age Modified"<<endl; cout << name1<< " "<<age1<<" "<<n1<<endl; cout << name2<< " "<<age2<<" "<<n2<<endl; cout << name3<< " "<<age3<<" "<<n3<<endl; return 0; }
内容的提问来源于stack exchange,提问作者jack is carbon
相关产品推荐
相关产品推荐

