繁体   English   中英

istream :: ignore和getline()混淆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM