0

我使用 cin.peek() 方法得到了这段代码。我注意到奇怪的行为,当输入到程序看起来qwertyu$[Enter]一切正常时,但当它看起来qwerty[Enter]$只有当我输入双美元符号时才有效qwerty[Enter]$$。另一方面,当我使用cin.get(char)一切正常时。

#include <iostream>
#include <cstdlib>

using namespace std;



int main()
{
char ch;
int count = 0;

while ( cin.peek() != '$' )
{
    cin >> ch;         //cin.get(ch);
    count++;
}

cout <<  count << " liter(a/y)\n";

system("pause");
return 0;
}


//Input:
// qwerty$<Enter>  It's ok
//////////////////////////
//qwerty<Enter>
//$                Doesn't work
/////////////////////////////
//qwerty<Enter>
//$$                 works(?)
4

2 回答 2

2

It's because your program won't get input from the console until the user presses the ENTER key (and then it won't see anything typed on the next line until ENTER is pressed again, and so on). This is normal behavior, there's nothing you can do about it. If you want more control, create a UI.

于 2012-09-26T12:21:35.167 回答
-1

老实说,我认为目前接受的答案不是那么好。

嗯,我再看一遍,因为它operator<<是一个格式化的输入命令,而且get()是一个普通的二进制文件,格式化的版本可能会等待比一个字符更多的输入来执行一些格式化魔术。

我认为它比get()你看它可以做什么要复杂得多。我认为>>会挂起,直到它完全确定它char根据设置的所有标志读取 a ,然后才会返回。因此它可以等待比一个字符更多的输入。例如,您可以指定skipws.

显然,它需要查看不止一次的输入字符才能获得charfrom \t\t\t test

我认为get()不受这些标志的影响,只会从字符串中提取一个字符,这就是为什么它更容易get()非阻塞方式表现。

认为当前接受的答案错误的原因是因为它表明程序将不会获得任何输入,直到[enter]或其他类似刷新的事情。在我看来,这显然不是这种情况,因为get()版本有效。如果它没有得到输入,为什么会这样呢?

由于缓冲,它可能仍然会阻塞,但我认为它的可能性要小得多,而且在您的示例中并非如此。

于 2012-09-26T15:46:00.163 回答