[英]istream::ignore and getline() confusion
尽管我自己不了解C ++,但我正在用C ++输入帮助某人。 这是一个简短的示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
int i;
string s;
cout << "enter i:\n";
cin >> i;
cout << "enter s:\n";
getline(cin, s);
//cin.ignore(100, '\n');
cout << "i: " << i << ", s: " << s << "\n";
}
正如预期的那样, getline()
调用不会提示用户输入,因为它只会在cin >> i
调用之后吞下尾随\\n
并立即返回。 我发现奇怪的是,如果取消注释cin.ignore()
调用,则getline()
调用将提示用户输入(即使不会将任何内容保存到s
)。 有人可以解释为什么吗? 我认为,所讨论的行根本不应更改行为。
我发现奇怪的是,如果取消注释cin.ignore()调用,则getline()调用将提示用户输入
不,不会。 提示用户的是ignore语句。 有了它,它实际上与getline所做的事情相同,只是它最多只能读取100个字符,并且只会丢弃它们。
好吧,不。 并非“ getline()
会提示用户输入”的情况。 显然, ignore
语句位于getline()
之后 。
发生的事情是, ignore()
语句只是阻塞直到它完成其任务,即吞掉100个字符或换行符(以先到者为准)(但要注意输入缓冲)。
通常,尽管没有直接关系,但建议:不要将令牌提取( >>
)和getline()
,因为这个问题涉及换行符。 只坚持一件事更好; 最好是在线阅读,以便您可以处理错误并重复提示。 还要考虑任何未经检查的读取操作( >>
, getline()
或istream::read()
)是编程错误; 所有这些都应该有条件。
等待输入的不是getline
调用,而是等待ignore
的“ ignore
调用。
将ignore
调用放在getline
之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.