C++使用getline()时输出第二行起首字符缺失的问题
解决C++中getline读取时首字符缺失的问题
这个问题我之前也碰到过,根源出在cin.ignore()的调用时机和用法上,咱们一步步拆解原因和解决方案:
问题原因
当你用cin >> t读取整数后,输入缓冲区里会残留一个换行符(就是你输入t后按下的回车)。如果直接调用getline,它会把这个换行符当成空行读取,所以你加了cin.ignore()来处理——但你把ignore()放在了循环内部,这就出问题了:
- 第一次循环时,
cin.ignore()确实吃掉了cin>>t留下的换行符,getline能正常读取第一行; - 但从第二次循环开始,上一次
getline已经把该行的换行符处理掉了,此时调用cin.ignore()会直接吃掉下一行的第一个字符,这就是你看到每行首字符缺失的原因!
解决方案1:只在读取整数后调用一次ignore()
只需要在cin >> t之后调用一次cin.ignore(),清除掉残留的换行符即可,循环内不再调用:
#include <iostream> #include <string> using namespace std; int main() { int t; cin >> t; // 仅清除cin>>t留下的换行符,放在循环外 cin.ignore(); string str; for(int i = 0; i < t; i++) { getline(cin, str); // 现在可以正常读取整行内容 cout << str << endl; } return 0; }
解决方案2:更稳妥的缓冲区清空方式
如果担心输入缓冲区里还有其他多余字符(比如用户输入t后不小心输入了空格再回车),可以用ignore()的重载版本,一次性清空缓冲区直到遇到换行符,不过需要包含<limits>头文件:
#include <iostream> #include <string> #include <limits> // 必须包含这个头文件 using namespace std; int main() { int t; cin >> t; // 忽略所有字符直到换行符,彻底清空缓冲区 cin.ignore(numeric_limits<streamsize>::max(), '\n'); string str; for(int i = 0; i < t; i++) { getline(cin, str); cout << str << endl; } return 0; }
这个方法能处理各种边界情况,比如用户输入t时前面有空格、后面多打了字符等,比单纯调用cin.ignore()更可靠。
内容的提问来源于stack exchange,提问作者Aravind Pabbisetty
相关产品推荐
相关产品推荐

