ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言非阻塞式键盘监听

2022-05-13 09:32:56  阅读:143  来源: 互联网

标签:Number C语言 键盘 按下 缓冲区 kbhit 监听


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

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

  • #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 下的运行结果:

Number: 1  //按下任意键
Number: 2  //按下任意键
Number: 3  //按下任意键
Number: 4  //按下任意键
Number: 5  //按下Esc键退出

这段代码虽然达到了监听键盘的目的,但是每次都必须按下一个键才能执行 getch() 后面的代码,也就是说,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("Number: %d\n", ++i);
  • Sleep(1000); //暂停1秒
  • }
  • return 0;
  • }

运行结果:

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5  //按下Esc键

每次循环,kbhit() 会检测用户是否按下某个键(也就是检测缓冲区中是否有数据),没有的话继续执行后面的语句,有的话就通过 getch() 读取,并判断是否是 Esc,是的话就退出循环,否则继续循环。

标签:Number,C语言,键盘,按下,缓冲区,kbhit,监听
来源: https://www.cnblogs.com/zjuhaohaoxuexi/p/16265410.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有