【问题标题】:Why `cin >> noskipws` doesn't wait for input?为什么`cin >> noskipws`不等待输入?
【发布时间】:2018-06-01 04:27:19
【问题描述】:

这是我的代码:

#include <iostream>
#include <vector>

using namespace std;

int main(){
    int x=-1;
    while(x != 0)
    {
        x = 0;

        cout << "nuevo numero: ";
        cin >> noskipws >> x;
        cout << x << endl;;
    }
}

输出是:

nuevo numero: 5  // I input that number
5
nuevo numero:    // Here it doesn't wait for an input
0                // I don't know where this come from, guess it's the empty input

我知道这与noskipws 有关,但我不知道确切原因,也不知道如何解决。

问题: 为什么第二个cin &gt;&gt; noskipws 不等待输入?我该如何解决?

【问题讨论】:

    标签: c++ input iostream cin


    【解决方案1】:

    为什么第二个 cin >> noskipws 不等待输入?

    因为不需要请求输入:你的程序还没有处理它已经给出的输入。

    当您输入第一个数字时,您按 5,然后按 enter。它将两个字符插入到输入流中:'5''\n'。第一个输入操作读取'5',它是一个可接受的数字字符,所以它消耗它。然后它看到 '\n',它不是 number 中的有效字符,所以它停在那里,将 '\n' 留在流中并根据已经读取的内容构造 number。

    在下一个输入操作中,它会在输入流中看到'\n'。它不是数字的有效字符,因此它会立即停止。通常,在尝试输入操作之前会跳过空白字符(这会导致输入缓冲区耗尽并请求更多输入),但您明确要求不要(通过设置noskipws 标志)。所以,你得到了你想要的。

    如果你想模仿流的默认行为来跳过空格,但不想禁用noskipws标志,你可以使用std::ws操纵器:

    std::cin >> std::ws >> i;
    

    它消耗所有字符,直到找到非空白字符。

    【讨论】:

    • 好的,我明白原因了。那么,如何重置指针的位置或删除我拥有的内容或替代方法?
    • std::ws 具有完全需要的行为。我还在其他地方发现使用std::cin &gt;&gt; std::noskipws &gt;&gt; i; cin.ignore(); 也可以根据需要使用。
    • @Fahed 你应该非常小心.ignore(),如果你不知道它实际上是做什么的。例如,如果您键入 '5'-space-enter,它将不起作用。
    • 我刚刚阅读了参考资料,您是对的。那么,std::ws 是唯一的出路吗?
    • @Fahed 如果您打算在下次输入之前跳过所有空白字符,最简单的方法是使用专门创建的标准库对象。当然,您可以通过使用.peek() 检查下一个字符并在它是不可打印字符时丢弃它来复制它的行为。
    【解决方案2】:

    如果您使用 noskipws,则跳过第一步。第一次之后 阅读,你被定位在一个空白处,所以下一个(以及所有 以下)读取将立即停止,不提取任何内容。

    【讨论】:

    • 好的,谢谢,我明白了。那么,如何重置位置或删除我拥有的内容或替代方法?
    【解决方案3】:

    你的程序没有做的是检查从流中提取数字是否成功。

    更新要使用的程序:

        cout << "nuevo numero: ";
        if ( cin >> noskipws >> x )
        {
           cout << x << endl;;
        }
        else
        {
           cout << "Unable to read.\n";
        }
    

    您会注意到第二次调用失败。它失败了,因为您指定了noskipws,但流中没有任何东西可以提取整数。

    noskipws 操纵器用于从流中读取字符,但不适用于读取数字。

    【讨论】:

    • 问题是,我需要读取空输入,如果发生这种情况,则完成程序。
    • @Fahed,你遇到了典型的X/Y problem
    • @R Sahu 我刚刚阅读了链接,实际上我不在 X/Y 中。但无论如何我会考虑未来的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-05-03
    • 2023-03-10
    • 2015-04-12
    • 2012-01-24
    • 2012-06-12
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多