在C语言中, _getch函数是非缓冲读数据的,当我们按下一个键之后,程序立马就会响应,不管按下的是否为回车键。应当注意的是,_getch函数不是标准库函数,想要使用该函数,应当包含conio.h头文件。

_getch函数是不带回显的,也就是说,当我们输入了一个字符,该字符会被程序接收,但是不会在显示器中显示出来。同时,_getch函数并不从缓冲区读取字符。因为该特性,_getch函数经常用作游戏中接受用户按键的函数。

但是,在使用该函数时,发现了问题:

在Debug版本下,第一次使用_getch函数后,下一次再使用_getch函数,会自动接受一个莫名其妙的\0。但是Release版本下不会有这个情况:

(在两个版本下,都只按了一下键盘,但是区别很明显)

所以怀疑(因为并没有直接的证据证明)是:在vs环境debug版本下使用_getch函数,实际上是从缓冲区读取字符(Release和Debug版本分别从两个dll里找函数,这就使得Release版本和Debug版本的函数一般都不同),而使用_getch函数时,该函数在读取后又向缓冲区放入了一个’\0’,这就导致了在下一次使用_getch函数时,_getch函数直接从缓冲区读到了’\0’。导致看起来程序并没有在第二次使用_getch函数时等待用户输入。

解决方法:

最基础的解决方法:

因为我们已经知道了出现上文所述问题的原因(暂且认为上面的假设成立),所以我们在第一次使用_getch()后再使用一次_getch()将缓冲区的字符’\0’取出来抛掉。那么在下一次使用_getch()时缓冲区中就没有字符可以接收,程序就会停在_getch处等待用户输入。

在这里可能有读者会提出另外一个问题,为什么不使用rewind(stdin)来清理缓冲区? 本人在这里也使用rewind(stdin)测试过,但是并没有起到作用,所以我怀疑在vs的Debug版本下,_getch()函数使用的是另外的缓冲区?

进阶的解决方法:

这种方法是自己编写一个getCh函数,在要使用_getch函数时可用getCh来代替两次连续两次使用_getch函数。

在这里可能又有读者要提问了:为什么你定义的getCh函数的返回类型是int型的?

这是因为getch函数的原型就是int型的函数,在使用后返回的是用户所输入的字符对应的ASCII码值。

(_getch函数原型)

当然,要是你愿意写成char型也可以,程序在运行时会自己转换类型处理。

比较严谨的解决方法:

因为在前两种解决方法中,我们只是针对了Debug版本做出了解决方法,因为在vs的Release版本下,使用_getch函数并不会出现开篇的问题,那么如果采用了前两种解决方法写的代码,又执行了Release版本,就会导致程序在运行时,用户输入一个字符后,还需要在按任意键才会向下继续执行,就会使用户体验极差。所以才会提到这种比较严谨的解决方法。即在Release版本下没有编译条件编译里的内容,这样就不会执行其中的内容。

当然,本文只是提供了解决问题的思路,观点不一定正确,还望各位前辈斧正。

PS:本文于2018年12月8日编写。本人第一次在CSDN发文,还请各位前辈多多指正。

VS2017下的getch函数相关推荐

  1. linux下实现getch()函数的功能

    #include <termio.h>int getch(void) {struct termios tm, tm_old;int fd = 0, ch;if (tcgetattr(fd, ...

  2. linux中c语言kbhit函数用法,linux下kbhit()函数 getch函数。

    对于上面的问题,都用到 linux下的getch函数与kbhit函数. 参考了http://kpld8888.wordpress.com/2007/03/07/linux%E4%B8%8B%E7%9A ...

  3. python getch函数_pyhton 下 使用getch(), 输入字符无需回车

    原代码来自 class _Getch: """Gets a single character from standard input. Does not echo to ...

  4. 在 Win vs2017 下编译 zint

    在 Win vs2017 下编译 zint 记录如何在 Win vs2017 下编译 zint. Zint是一个强大的二维码编码生成开源工具,基于C语言开发,支持Code 128, Data Matr ...

  5. python getch_macOS 下的 getch()

    macOS 下的 getch() 我想在c语言写的某程序实现 "按下任意键继续...".这在windows 下好实现,用getch()就行了. 但是,macOS 用同样的办法,cl ...

  6. 在linux中使用getch()函数

    #include <termio.h>int getch(void) {struct termios tm, tm_old;int fd = 0, ch;if (tcgetattr(fd, ...

  7. UNIX_C 环境下实现输入一个字符,不用回车直接输入功能(类型windows下_getch(void)函数)

    UNIX_C 环境下实现输入一个字符,不用回车直接输入功能(类型windows下_getch(void)函数) /*int getch ( void ); 输入流获取一个信号当键盘输入一个字符时,不用 ...

  8. getchar()用法 与 getch()函数使用方法

    getchar()用法 1.从缓冲区读走一个字符,相当于清除缓冲区2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getc ...

  9. C语言项目-精忠报国-第二天-COORD windows.h头文件/conio.h getch()函数/game.c showMap()函数 文字突出/怪物计数与打印/随机攻击力 stblib.h

    项目来源:老九君 项目名称:精忠报国之笑傲江湖 视频课地址:网易云课堂 基本功能/架构: 第二天 今天看得比较快,基本把这个项目结束了吧,明天再仔细看一下有没有遗漏的这项目就应该算是结束了.项目难度的 ...

  10. Visual Studio 2022中kbhit()函数与getch()函数的书写问题

    1.kbhit()_函数 kbhit()函数的作用是检查控制台窗口的按键是否被按下.如果在调用函数时,有按键被按下,则返回值为一个非0的值,否则该函数的返回值是0.kbhit()函数一般与getch( ...

最新文章

  1. Spring为什么建议构造器注入?
  2. 使用条件卷积进行实例和全景分割
  3. CentOS7 RedHat7 添加静态路由方法
  4. 73. 解决ExtJS TreePanel 的 iconCls设置问题
  5. boost::hana::reverse_partial用法的测试程序
  6. 如何在IE地址栏显示自己的小图标
  7. cx_Oracle安装出现的问题
  8. IntelliJ IDEA 2020.1 快速查找文件
  9. java合并不连续的时间段_基于时间戳不完全匹配的pandas合并
  10. 力扣--220存在重复I-III
  11. 安装navicat之后双击就会闪退_win2012,2016 能安装oracle 10g吗?
  12. p2p - cdn传输技术杂谈
  13. 安装Cab升级文件的6个方法
  14. CTFshow—MISC图片篇(基础操作)
  15. 我劝你最好别偷看我的HTTP总结
  16. 忆实习与假期的bili
  17. 我的世界服务器右侧显示的字幕,我的世界怎么用命令方块显示字幕
  18. 蓝牙室内定位UWB多技术融合趋势
  19. video.js 播放 流媒体
  20. 计算机教师面试专业技能部分,教师招聘考试面试,专业技能测试考什么?全在这了...

热门文章

  1. 操作系统原理与实践-1熟悉实验环境
  2. python控制电脑定时开机关机软件_用python写一个windows下的定时关机脚本(推荐)
  3. android黑名单挂断电话(endCall)反射方法获取
  4. 如何获取最新中国县级行政区划矢量数据
  5. 兄弟连新版PHP视频教程(共346讲)
  6. 比Spark更适合工业互联网的数据库——热门时序数据库介绍与核心文档汇总【施工中,欢迎留言加入】
  7. 微信小程序开发——字体样式设置
  8. VS2017_Reshaper
  9. 2018关于认证第三方IATF 16949:2016审核完成不符合事项分析
  10. Java Agent实战