getch()函数的使用方法及其返回值问题
getch()函数依赖于头文件 conio.h .会在windows平台下从控制台无回显地取一个字符,并且返回读取到的字符。
然而,我在实际用这个函数才发现getch()这个函数并不简单。
getch函数从控制台读取单个字符而不回显,函数不能去读取CTRL+C,当读取一个功能键或方向键,函数必须调用两次(这就说明可以用这个函数去监控功能键和方向键),第一次调用返回0或0xe0,第二次返回实际的键代码
例如:
#include <stdio.h>
#include <conio.h>
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=59
- F2 tmp=0 tmp2=60
- F3 tmp=0 tmp2=61
- F10 tmp=0 tmp2=68
F1~F10,getch()第一次返回 0 ,第二次返回该键的真实键值(59~68)
- F11 tmp=224 tmp2=133
- F12 tmp=224 tmp2=134
- Delete tmp=224 tmp2=83
那么问题就来了,getch()一会返回一个值,一会返回两个值,究竟要怎样写才不会出错呢?
我这里提供一种方法,仅供参考
#include <conio.h>
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://F1printf("This is F1\n");break;default:break;}}else //普通按键,如字母、数字、space,Esc等按键{switch (tmp){case 32://空格printf("This is Space\n");break;case 27://Escprintf("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()函数即可
getch()函数的使用方法及其返回值问题相关推荐
- Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法
函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...
- 如何引用传递参数从一个函数中得到多个返回值
2019独角兽企业重金招聘Python工程师标准>>> 通过"引用"传递参数的方法从一个函数中得到多个返回值.就像三元运算符一样,大部分受过正式编程训练的程序员都 ...
- Java基础知识之方法的返回值与重载
文章目录 一.方法的返回值 二.方法的重载 一.方法的返回值 1.说明 就是方法调用结束的标志,会返回一个值给调用该方法的方法里,然后我们常用的就是使用一个变量去接收这个值,并把这个值用作其他的操作. ...
- java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function
文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...
- Android WebView 调用JS方法获取返回值
一.Android4.4+ 如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值 webview ...
- executescalar mysql_DbCommand.ExecuteScalar 方法的返回值
DbCommand.ExecuteScalar 方法 执行查询,并返回查询所返回的结果集中第一行的第一列. 所有其他的列和行将被忽略. 语法: public abstract Object Execu ...
- smali语言详解之一般/构造方法(函数)的声明与返回值关键字
smali语言详解之一般/构造方法(函数)的声明与返回值关键字 一. smali语言的方法声明格式 .method与.end method成对出现,类似于java中的花括号 1.1.非静态的一般方法 ...
- java gettext返回值_012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)...
EditText中的getText()方法的返回值为CharSequence,如果我们想要获得string类型数据的话,需要在后边加上.toString 另外,String类型转为int:Intege ...
- document.getElementsByTagName()方法的返回值
document.getelementsbytagname()方法的返回值 /* document.getelementsbytagname()方法的返回值中取出某个特定的元素.一开始以为它的返回值是 ...
- Spring-AOP @AspectJ进阶之绑定连接点方法的返回值
文章目录 概述 实例 概述 在后置增强中,可以通过returning绑定连接点方法的返回值 实例 代码已托管到Github-> https://github.com/yangshangwei/S ...
最新文章
- 95E Lucky Country
- office老是提示Microsoft office word 遇到问题需要关闭,问是否发送错误报告
- [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]
- 13c语言中的文件是一种流式文件,读写时均以字符为单位.,C语言判断题部分.doc...
- 《Python Cookbook 3rd》笔记(5.2):打印输出至文件中
- python链表实现栈_python实现链表队列栈
- 易优CMS精美简洁作文范文网站模板源码
- GARFIELD@04-13-2005
- 浅谈今日头条关键词下拉词框优化推广的优势
- 【RobotStudio学习笔记】(四)夹取工件程序设计
- java 代码效率_提高代码性能效率总结(一)--Java
- 对话清华NLP实验室刘知远:NLP搞事情少不了知识库与图神经网络
- oracle可视化操作界面——plsql dev安装配置与使用
- 利用Delphi编写屏幕保护程序
- 计算机游戏程序启动错误及其解决方法汇总
- Javaweb面试题(一)———更新中
- 制作颜色选择器(全)
- Java 实现计算器功能
- 【SpringBoot新手篇】SpringBoot优雅文件上传方式
- 「3D视觉技术交流群」精华帖与关键问题