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的越界赋值即其原理剖析

解决办法:

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

注意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()函数的使用方法及其返回值问题相关推荐

  1. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  2. 如何引用传递参数从一个函数中得到多个返回值

    2019独角兽企业重金招聘Python工程师标准>>> 通过"引用"传递参数的方法从一个函数中得到多个返回值.就像三元运算符一样,大部分受过正式编程训练的程序员都 ...

  3. Java基础知识之方法的返回值与重载

    文章目录 一.方法的返回值 二.方法的重载 一.方法的返回值 1.说明 就是方法调用结束的标志,会返回一个值给调用该方法的方法里,然后我们常用的就是使用一个变量去接收这个值,并把这个值用作其他的操作. ...

  4. java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function

    文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...

  5. Android WebView 调用JS方法获取返回值

    一.Android4.4+ 如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值 webview ...

  6. executescalar mysql_DbCommand.ExecuteScalar 方法的返回值

    DbCommand.ExecuteScalar 方法 执行查询,并返回查询所返回的结果集中第一行的第一列. 所有其他的列和行将被忽略. 语法: public abstract Object Execu ...

  7. smali语言详解之一般/构造方法(函数)的声明与返回值关键字

    smali语言详解之一般/构造方法(函数)的声明与返回值关键字 一. smali语言的方法声明格式 .method与.end method成对出现,类似于java中的花括号 1.1.非静态的一般方法 ...

  8. java gettext返回值_012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)...

    EditText中的getText()方法的返回值为CharSequence,如果我们想要获得string类型数据的话,需要在后边加上.toString 另外,String类型转为int:Intege ...

  9. document.getElementsByTagName()方法的返回值

    document.getelementsbytagname()方法的返回值 /* document.getelementsbytagname()方法的返回值中取出某个特定的元素.一开始以为它的返回值是 ...

  10. Spring-AOP @AspectJ进阶之绑定连接点方法的返回值

    文章目录 概述 实例 概述 在后置增强中,可以通过returning绑定连接点方法的返回值 实例 代码已托管到Github-> https://github.com/yangshangwei/S ...

最新文章

  1. 95E Lucky Country
  2. office老是提示Microsoft office word 遇到问题需要关闭,问是否发送错误报告
  3. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]
  4. 13c语言中的文件是一种流式文件,读写时均以字符为单位.,C语言判断题部分.doc...
  5. 《Python Cookbook 3rd》笔记(5.2):打印输出至文件中
  6. python链表实现栈_python实现链表队列栈
  7. 易优CMS精美简洁作文范文网站模板源码
  8. GARFIELD@04-13-2005
  9. 浅谈今日头条关键词下拉词框优化推广的优势
  10. 【RobotStudio学习笔记】(四)夹取工件程序设计
  11. java 代码效率_提高代码性能效率总结(一)--Java
  12. 对话清华NLP实验室刘知远:NLP搞事情少不了知识库与图神经网络
  13. oracle可视化操作界面——plsql dev安装配置与使用
  14. 利用Delphi编写屏幕保护程序
  15. 计算机游戏程序启动错误及其解决方法汇总
  16. Javaweb面试题(一)———更新中
  17. 制作颜色选择器(全)
  18. Java 实现计算器功能
  19. 【SpringBoot新手篇】SpringBoot优雅文件上传方式
  20. 「3D视觉技术交流群」精华帖与关键问题

热门文章

  1. 手撸一个基于Springboot+Vue的书籍论坛系统,可用于课程设计和毕业设计或者练手
  2. 清华大学:模拟电子技术基础
  3. 同义词林Java如何更新维护,solr词库实时更新维护
  4. Glide在github上的jar包下载方法
  5. 红米k50 至尊版 解锁bl 获取root教程步骤
  6. 面试官:如何进行 JVM 调优(附真实案例)
  7. CTF-Web SQL注入
  8. Java URLEncoder 和 URLDecoder 对中文进行编码和解码
  9. 【keil5】安装及注册
  10. 好友管理系统--python