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

Strange cout behavior in a while loop in C++

我正在尝试打印输入,然后打印 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:

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

使用 >> 流式传输到字符串中读取单个单词,最多为一个空白字符。所以你得到两个独立的输入,"Hello""world".

阅读整行:

getline(cin, input);

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

关键部分是:

[...] then reads characters [...] until one of the following conditions becomes true:

[...]

  • std::isspace(c,is.getloc()) is true for the next character c in is (this whitespace character remains in the input stream).

这意味着它“吃掉”输入,直到遇到白色 space(根据当前语言环境)。当然正如迈克所说,对于整行,有 getline.

这个吹毛求疵也值得记住: