istream :: ignore和getline()混淆

时间:2011-11-12 16:38:34

标签: c++ iostream

我正在帮助有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 )。有人能解释为什么吗?在我看来,有问题的行根本不应改变行为。

3 个答案:

答案 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

之前