C ++中while循环中奇怪的cout行为

时间:2015-01-28 17:03:09

标签: c++ iostream

我正在尝试打印输入,然后打印tk向量中的所有字符串,如下面的程序:

int main() {
    while (true) {
        string input;
        cout << "prompt: ";
        cin >> input;
        vector<string> tk = {"this", "is", "an", "example"}; 

        cout << input << endl;
        for (int i = 0; i < tk.size(); i++) {
            cout << tk[i] << endl;
        }

    }   
    return 0; 
}

当我输入“Hello world”时,我希望输出为:

Hello world
this
is
an 
example
prompt: 

但输出是:

Hello
this
is
an
example
prompt: world
this
is 
an
example
prompt:

有谁知道这里出了什么问题?我猜原因与缓冲区的工作方式有关,但我真的不知道细节。

2 个答案:

答案 0 :(得分:3)

使用>>流式传输到字符串中,读取单个字,最多为空白字符。因此,您可以获得两个单独的输入"Hello""world"

阅读整行:

getline(cin, input);

答案 1 :(得分:0)

缓冲区工作正常。 opreator>>背后的逻辑是......嗯......有点复杂。实际上,您使用自由站立的operator>>作为输入流和字符串 - this no (2)

关键部分是:

  

[...]然后读取字符[...],直到满足以下条件之一:

     

[...]

     
      
  • std::isspace(c,is.getloc())对于is中的下一个字符c是正确的(此空白字符保留在输入流中)。
  •   

这意味着&#34;吃掉&#34;输入直到满足空白区域(根据当前区域设置)。当然,迈克说,对于整行来说,有getline

值得记住这个挑剔:Why does cin command leaves a '\n' in the buffer?