C++中getline函数为何无法读取指定输入?
为啥getline没读到内容?我来给你捋清楚
你遇到的这个问题其实是C++输入缓冲区的经典小坑,很多刚接触输入输出的开发者都会踩。
当你用 cin >> n >> m 读取那两个整数的时候,cin 的工作逻辑是:跳过输入里的空格、换行这类空白字符,精准读取整数内容,但读完之后,输入缓冲区里会留下你输入完整数后按下的回车(也就是换行符 \n)。
接下来你调用 getline(cin, set),这个函数的规则是「从缓冲区读取字符,直到碰到换行符就停止,而且不会把换行符存到目标字符串里」。这时候它一检查缓冲区,第一个碰到的就是之前残留的那个换行符,直接就判定「读取完成」,所以给set赋值了一个空字符串,输出自然就啥也没有。
举个直观的输入场景例子,假设你是这么输入的:
1 5[回车]
Hello World[回车]
那输入缓冲区里,cin读完1和5之后,剩下的就是第一行的那个\n。getline一上来就读到这个换行符,直接结束读取,根本没机会碰到底下的Hello World。
那怎么解决呢?很简单,在cin >> n >> m之后,把缓冲区里的残留换行符清掉就行。你可以用cin.ignore()忽略单个字符,但更稳妥的是忽略掉直到换行的所有字符,代码修改如下:
#include <iostream> #include <string> #include <limits> // 要加这个头文件来使用numeric_limits using namespace std; int main() { unsigned n {}, m {}; cin >> n >> m; // 忽略缓冲区里直到换行的所有字符,包括换行本身 cin.ignore(numeric_limits<streamsize>::max(), '\n'); string set; getline(cin, set); cout<<set<<endl; return 0; }
这样再输入的话,getline就能正常读到你后面的Hello World啦。
内容的提问来源于stack exchange,提问作者Rishi K.
相关产品推荐
相关产品推荐

