用c / c ++清除用户输入缓冲区

时间:2014-07-17 22:55:11

标签: c++ c input buffer

我想清除输入缓冲区,但不知道如何,请继续尝试代码:

#include <windows.h>

using namespace std;

int main()
{
    do {
        Sleep(500);
        if (kbhit())
            cout << (char) getch() << endl;
    } while(1);
}

如果我垃圾邮件 - 按键盘,信件将逐个打印,每个字母延迟500毫秒。

  

如何清除整个输入缓冲区,即使按下多个

,也只会出现一个字母

2 个答案:

答案 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毫秒;在第二个版本中,如果要显示(即被按下冷却时间),你的击键会立即出现。