我正在帮助有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()
调用不会提示用户输入,因为它只会在\n
调用后吞下尾随cin >> i
并立即返回。我发现奇怪的是,如果您取消注释cin.ignore()
来电,getline()
来电将提示用户输入(即使没有任何内容会保存到s
)。有人能解释为什么吗?在我看来,有问题的行根本不应改变行为。
答案 0 :(得分:1)
我觉得奇怪的是,如果你取消注释cin.ignore()调用,那么 getline()调用将提示用户输入
不,它不会。这是提示用户的ignore语句。正如你所拥有的那样,它与getline基本上做的是相同的事情,除了它只能读取多达100个字符,它只会把它们扔掉。
答案 1 :(得分:1)
嗯,不。情况并非“getline()
将提示用户输入”。显然ignore
语句在 getline()
之后
发生的事情是ignore()
语句只是阻塞直到它完成任务,即吞噬100个字符或换行符,以先到者为准(但请注意输入缓冲)。
作为一般性的,虽然没有直接相关的建议:不要混合令牌提取(>>
)和getline()
,这完全是关于换行的问题。坚持一件事要好得多;最好是行阅读,这样你就可以处理错误并重复提示。还要考虑任何未经检查的读取操作(>>
,getline()
或istream::read()
)编程错误;应该有所有这些条件。
答案 2 :(得分:1)
这不是等待输入的getline
调用,而是等待忽略的ignore
调用。
将ignore
来电置于getline
。