我想清除输入缓冲区,但不知道如何,请继续尝试代码:
#include <windows.h>
using namespace std;
int main()
{
do {
Sleep(500);
if (kbhit())
cout << (char) getch() << endl;
} while(1);
}
如果我垃圾邮件 - 按键盘,信件将逐个打印,每个字母延迟500毫秒。
如何清除整个输入缓冲区,即使按下多个
,也只会出现一个字母
答案 0 :(得分:0)
所以你正在编写一个Windows控制台应用程序。不是DOS而不是跨平台兼容。
您可以使用Windows控制台功能。见http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx
特别是你可以使用GetStdHandle获取句柄,然后使用句柄上的WaitForSingleObject。可能是500毫秒超时而不是您当前的睡眠。
然后你应该能够ReadConsole读取自上次读取以来已经缓冲的所有输入。如果你想要第一个字符或最后一个字符,你只需要那个字符。
您需要添加许多详细信息才能使其真正有用。
答案 1 :(得分:0)
这取决于您希望行为的确切程度。由于您没有详细说明,我将提供两个:
// ...
do {
Sleep( 500 );
if ( kbhit( ) ) {
cout << (char) getch( ) << endl;
while ( kbhit( ) )
getch( );
}
} while ( 1 );
// ...
在其中添加while
循环,清除缓冲区内的其余按键。它通过检查条件是否存在剩余击键来执行此操作,在这种情况下将其丢弃。
虽然这似乎是你想要的方式,但我想建议以下内容,我认为这会更顺畅:
// ...
do {
cout << (char) getch( ) << endl;
Sleep( 500 );
while ( kbhit( ) )
getch( );
} while ( 1 );
// ...
它变得更平滑的方式不会像500
那样被延迟识别,但会将其提升到2500
并且您可能理解我的意思。在第一个版本上,您的击键次数将始终延迟0 ~ 500/2500
毫秒;在第二个版本中,如果要显示(即被按下冷却时间),你的击键会立即出现。