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
.
这个吹毛求疵也值得记住:
我正在尝试打印输入,然后打印 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
.
这个吹毛求疵也值得记住: