为何' '残留输入流需用cin.ignore()清除?cin与getline规则解析
cin与getline输入流问题解答
先看你给出的示例代码:
int main() { string a, b; cin >> a; // cin.ignore(10000, '\n'); getline(cin, b); // 这里因为没忽略前面的\n,getline会直接终止,读不到输入 cout << a << endl; cout << b << endl; }
一、为什么'\n'会残留在输入流中?
当你用cin >> a读取字符串时,这个运算符的行为是自动跳过开头的所有空白字符(包括空格、换行、制表符),然后从第一个非空白字符开始读,直到遇到下一个空白字符就停止读取。
比如你输入test\n(输入完test后按回车),cin >> a会把test存入变量a,但末尾的\n会被留在输入流里——因为cin >>遇到空白字符就停,不会把这个终止用的空白字符读走。
接下来调用getline(cin, b)时,它会从输入流的当前位置(也就是那个残留的\n)开始读取,而getline的终止条件就是遇到\n,所以它会直接把这个\n从流里移除,但不会把它存入b,导致b变成空字符串,看起来就像没读取到输入。
二、cin与getline()处理空格、分隔符的规则
cin >> 运算符的规则
- 自动跳过输入流开头的所有空白字符(空格、
\n、\t等); - 从第一个非空白字符开始读取,直到遇到下一个空白字符时停止,不会读取这个终止的空白字符,而是将其留在输入流中;
- 只能读取不含空白的连续字符,比如输入
hello world,cin >> a只会把hello存入a,剩下的world(包括前面的空格)会留在输入流里。
getline()函数的规则
- 不会跳过开头的空白字符,从输入流的当前位置开始读取所有字符;
- 读取到换行符
\n时停止,并且会把这个\n从输入流中移除,但不会将它存入目标字符串; - 可以读取包含空格、制表符等空白字符的整行内容,只要没遇到
\n就会持续读取。
内容的提问来源于stack exchange,提问作者user20332975
相关产品推荐
相关产品推荐

