在 VC 下清空键盘缓冲区的方法
作者:yangw80

(以下代码在 VC 下通过)

控制台窗口是有输入缓冲区的,当你按键后程序没有来得及处理,系统会将按键缓存,等到程序获取按键的时候,系统会把缓冲区里面之前的按键返回。

例如这个程序:

#include <graphics.h>
#include <stdio.h>
#include <conio.h>

int main()
{
	printf("延时 5 秒钟。请在 5 秒钟内随便按键。\n");
	Sleep(5000);

	printf("延时结束。刚才您按下的按键是:\n");

	while (_kbhit())
	{
		char c = _getch();
		printf("%c", c);
	};

	return 0;
}

请自己执行一下前面的程序,在 5 秒延时内随便按键,等到延时结束,可以看到程序可以读出刚才的按键。

但是有些时候,我们是不需要保留之前的按键的。我们可以借助 Windows 提供的控制台 API 实现:

#include <graphics.h>
#include <stdio.h>
#include <conio.h>

int main()
{
	printf("延时 5 秒钟。请在 5 秒钟内随便按键。\n");
	Sleep(5000);

	// 调用控制台 API,清空之前缓冲区内的所有按键。
	FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));

	printf("延时结束。刚才您按下的按键是:\n");

	while (_kbhit())
	{
		char c = _getch();
		printf("%c", c);
	};

	return 0;
}

这段代码只在前面代码的基础上,增加了一行清空键盘缓冲区的函数调用。然后执行程序后可以看到,最后的输出循环无法获取到之前的任何按键。

这个功能在游戏中会很有用。例如,游戏开始之前,会有些等待(例如过场动画)。正式游戏开始时,应该清空按键缓冲区,防止用户在等待期间的按键影响游戏操作。

更新时间:2015/5/22