C语言缓冲区、输入输出、与阻塞式监听、非阻塞式监听 您所在的位置:网站首页 c语言鼠标控制函数 C语言缓冲区、输入输出、与阻塞式监听、非阻塞式监听

C语言缓冲区、输入输出、与阻塞式监听、非阻塞式监听

2024-06-03 12:09| 来源: 网络整理| 查看: 265

一、Windows中的非阻塞式监听实现

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

#include #include 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 #include #include 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,是的话就退出循环,否则继续循环。

C语言非阻塞式键盘监听_cbirdfly.的博客-CSDN博客

二、C语言输入输出缓冲区

【C】C语言输入输出缓冲区_Vincent's Blog的博客-CSDN博客

几个很“诡异”的例子

1、先来看一个小程序,分析一下运行结果

#include int main() { printf("hello"); int i = 0; for(;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有