所谓键盘监听,就是用户按下某个键时系统做出相应的处理 ,本章讲到的输入输出函数也是键盘监听函数的一种,例如 getchar()、_getche()、_getch() 等。

下面的代码演示了 _getch() 函数的使用:

#include <stdio.h>
#include <conio.h>
int main() {
	char ch;
	int i = 0;
	//循环监听,直到按Esc键退出
	while (ch = _getch()) {
		if (ch == 27) {
			break;
		else {
			printf("Number: %d\n", ++i);
	return 0;

在 Windows 下的运行结果:

这段代码虽然达到了监听键盘的目的,但是_getch() 后面的代码被阻塞了

阻塞式键盘监听用于用户输入时一般没有任何问题,用户输入完数据再执行后面的代码往往也符合逻辑。然而在很多小游戏中,阻塞式键盘监听会带来很大的麻烦,用户要不停按键游戏才能进行,这简直就是灾难,所以在小游戏中一般采用非阻塞式键盘监听:用户输入数据后程序可以捕获,用户不输入数据程序也可以继续执行

在 Windows 系统中,conio.h头文件中的_kbhit()函数就可以用来实现非阻塞式键盘监听

conio.h 是 Windows 下特有的头文件,所以 _kbhit() 也只适用于 Windows,不适用于 Linux 和 Mac OS

用户每按下一个键,都会将对应的字符放到输入缓冲区中,_kbhit() 函数会检测缓冲区中是否有数据,如果有的话就返回非 0 值,没有的话就返回 0 值。但是 _kbhit() 不会读取数据,数据仍然留在缓冲区,所以一般情况下我们还要结合输入函数将缓冲区中的数据读出

请看下面的例子:

#include <stdio.h>
#include <windows.h>
#include <conio.h>
int main() {
	char ch;
	int i = 0;
	//循环监听,直到按Esc键退出
	while (1) {
		if (_kbhit()) { //检测缓冲区中是否有数据
			ch = _getch(); //将缓冲区中的数据以字符的形式读出
			if (ch == 27) {
				break;
				printf("%c\n",ch);
		printf("Number: %d\n", ++i);
		Sleep(1000); //暂停1秒
	return 0;

运行结果:

 (个人:我们按键时,可以连着按,输入多个字符到缓冲区中,_getch()会一一读取完)