我使用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(?)
答案 0 :(得分:2)
这是因为在用户按下ENTER键之前,你的程序不会从控制台获得输入(然后在再次按下ENTER之前它不会在下一行显示任何内容,等等)。这是正常行为,你无能为力。如果您想要更多控制权,请创建一个UI。
答案 1 :(得分:-1)
老实说,我不认为目前接受的答案是好的。
嗯再看一遍我认为,因为operator<<
是一个格式化的输入命令,而get()
是一个普通的二进制文件,格式化的版本可能正在等待更多的输入而不是一个字符来做一些格式化魔术
如果你看看它能做什么,我认为它比get()
更复杂。我认为>>
会挂起,直到它完全确定根据所有标志设置读取char
,然后才会返回。因此,它可以等待比一个字符更多的输入。例如,您可以指定skipws
。
显然需要查看多个输入字符才能从char
获取\t\t\t test
。
我认为get()
不会受到此类标记的影响,只会从字符串中提取一个字符,这就是为什么get()
更容易在非阻塞中表现的原因方式。
之所以认为当前接受的答案是错误的,是因为它声明程序在[enter]
或其他类似的类似事件之前不会得到任何输入。在我看来,get()
版本的工作原理显然不是这种情况。为什么会这样,如果它没有得到输入?
它可能仍然会因缓冲而阻塞,但我认为它不太可能,并且在你的例子中并非如此。