为什么`cin>> noskipws`不等待输入?

时间:2017-12-18 19:20:50

标签: c++ input iostream cin

这是我的代码:

#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 >> noskipws不等待输入?我该如何解决?

3 个答案:

答案 0 :(得分:1)

  

为什么第二个cin&gt;&gt; noskipws不等待输入?

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

输入第一个数字时,按 5 ,然后输入。它会在输入流中插入两个字符:'5''\n'。第一个输入操作读取'5',它是一个可接受的字符,因此它会消耗它。然后它看到&#39; \ n&#39;,它不是数字中的有效字符,所以它停在那里,离开&#39; \ n&#39;在流中并根据已经阅读的内容构建数字。

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

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

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

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

答案 1 :(得分:0)

  

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

答案 2 :(得分:0)

您的程序未能做的是检查从流中提取数字是否成功。

更新要使用的程序:

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

您会注意到第二次通话失败。它失败是因为您指定了noskipws,但流中没有任何内容可以提取整数。

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