getch()函数的使用方法及其返回值问题 您所在的位置:网站首页 标准键盘码值表 getch()函数的使用方法及其返回值问题

getch()函数的使用方法及其返回值问题

2023-10-14 07:21| 来源: 网络整理| 查看: 265

getch()函数依赖于头文件 conio.h .会在windows平台下从控制台无回显地取一个字符,并且返回读取到的字符。

然而,我在实际用这个函数才发现getch()这个函数并不简单。

getch函数从控制台读取单个字符而不回显,函数不能去读取CTRL+C,当读取一个功能键或方向键,函数必须调用两次(这就说明可以用这个函数去监控功能键和方向键),第一次调用返回0或0xe0,第二次返回实际的键代码

例如:

#include #include int main() { while (true) { int tmp = _getch(); printf(" ……\n"); //测试每键入一次,打印几次 } return 0; }

在这个简单的小程序中,我测试了几个键盘的按键。

在a~z的英文字母、数字键、以及Tab、space、ESC、Backspace、Enter等几个常用键上,printf()只会打印一次,也就是说,getch()会立即返回真实的键码值,并且被tmp变量接收。在键盘上输入上下左右的方向键,F1~F9、Delete等功能键时,printf()会打印两次。

为了探究getch()的真相,我改写了以上函数。

int main() { while (true) { int tmp = _getch(); int tmp2 = _getch(); printf(" tmp=%d\n tmp2=%d\n",tmp,tmp2); } return 0; }

在键盘上依次输入上下左右得到如下键值:

上     tmp=224     tmp2=72下     tmp=224     tmp2=80左     tmp=224     tmp2=75右     tmp=224     tmp2=77

上下左右方向键,getch()第一次返回 224(0xe0),第二次返回真实键值

在键盘上依次输入F1~F10、F11、F12、Delete得到如下键值: 

F1        tmp=0    tmp2=59F2        tmp=0    tmp2=60F3        tmp=0    tmp2=61F10      tmp=0    tmp2=68

F1~F10,getch()第一次返回 0 ,第二次返回该键的真实键值(59~68)

F11         tmp=224    tmp2=133F12         tmp=224    tmp2=134Delete     tmp=224    tmp2=83

那么问题就来了,getch()一会返回一个值,一会返回两个值,究竟要怎样写才不会出错呢?

我这里提供一种方法,仅供参考

#include int main() { char tmp; //读取键值,或过滤功能键的第一个返回值 char tmp2; //接受功能键 while (true) { tmp = _getch(); if (tmp == 0 || tmp == -32)//表示读取的是功能键或者方向键,丢掉第一个返回值,读取第二个返回值 { switch (tmp2 = _getch()) //接収功能键返回值 { case 72://上 printf("This is ↑\n"); break; case 59://F1 printf("This is F1\n"); break; default: break; } } else //普通按键,如字母、数字、space,Esc等按键 { switch (tmp) { case 32://空格 printf("This is Space\n"); break; case 27://Esc printf("This is Esc\n"); break; default: break; } } } return 0; }

注意1:在以上代码中 tmp 为char类型,可接受的值为 -128~127之间,所以原本 0xe0的返回值(10进制为224) 会被转换为 -32。

转换原理为 超出char范围的(即127以后的数字),把差值从 char类型的另一侧极限值重新开始计算(即-128往后排)

例如:224——> 超出97(224-127)——> -128+97-1=-32 

详见char的越界赋值即其原理剖析

解决办法:

可以把tmp定义 unsigned char类型通过计算、或者测试,得到可用的键值。

注意2:用getch()函数时,编译器可能会给出如下错误

严重性    代码    说明    项目    文件    行    禁止显示状态 错误    C4996     'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.      

解决办法:把getch()换成编译器要求的_getch()函数即可 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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