当前位置: 首页 > news >正文

循环程序跳出(_kbhit()、getch() 、getchar())

在构建一个循环程序的时候 程序跳出环节 是构建一个合理的程序重要的一环 在进行程序跳出的过程 如何触发程序跳出条件也是一个重要的环节


按键流触发跳出条件

以下代码为一个完整的按键跳出循环程序

int i = 10,j=0;
while (j < i)
{
	i += 3;
	Sleep(520);
	cout << "正在加油中!! 目前油量" << i << "% \r";
	if (_kbhit())//非阻塞的响应键盘输入时间 (检测是否有按键按下,有按下返回非0值,一般是1没有按下返回0 需要包含 <conio.h>文头件)
	{
		if (_getch() == 27)//从标准输入流(键盘)读取ESC键 (相较于getchar()接收按键后还需按下回车才能返回 _getch()不用按下回车就能返回 返回值为输入的Ascii码  需要包含 <conio.h>头文件)
		{
			cout << "暂停加油!! 当前油量 :" << j << endl;//显示程序跳出提示并换行
			cout << endl;//再次换行
			break;
		}
	}
}

一个完整的按键跳出程序 需要一个while循环 一个_kbhit()非阻塞键盘函数_getch()获取键盘流字符的函数
要使用这两个函数必须包含<conio.h>通用输入输出库


_kbhit()函数

_kbbit()函数的作用是检查控制台窗口的按键是否被按下 其格式为

int _kbhit( void );

如果在调用该函数时,有按键被按下,则返回一个非0值 ,否则该函数的返回值是0 需要注意的是,该函数是一个非阻塞函数不管有没有按键被按下,该函数都会立即返回 _khbit()函数一般与_getch()函数与getche()函数组合使用获取按键信息


为什么需要此函数?
因为_getch()和getchar()等从控制台获取输入字符函数具有阻塞性 只有从控制台读取到了输入的字符才会有返回值(程序运行至此停滞 等待从控制台获取输入字符)导致程序无法正常循环 在获取字符函数外层包裹一个无论有没有输入字符都会返回值的 _kbhit()函数作为判断条件 则能使程序在正常循环的过程中能被随时进行按键中断跳出


_getch()函数

_getch()函数的作用是从控制台中获取输入的字符,在获取输入的字符之后,并不会在控制台中显示该字符 该函数的格式为

int _getch( void );

该函数的返回值是获取到的字符值。需要注意的是,_getch()函数是一个阻塞函数,直到有字符输入时才会返回,所以该函数不会返回错误值

getch();接受一个任意键的输入,不用按回车就返回该函数的返回值是所输入字符的ASCII码,且该函数的输入不会自动显示在屏幕上,需要putchar();函数输出显示 getch();函数常用于中途暂停程序方便调试和查看


getchar()函数

getchar();从键盘读取一个字符并输出,该函数的返回值是输入第一个字符的ASCII码,若用户输入的是一连串字符,函数直到用户输入回车时结束,输入的字符连同回车一起存入键盘缓冲区,若程序中有后继的getchar();函数,则直接从缓冲区逐个读取已输入的字符并输出,直到缓冲区为空时才重新读取用户的键盘输入


_getch()函数与 getchar()函数的区别

_getch()函数的作用是获取按键信息,且该函数在conio.h中定义。_getche()函数与_getch()函数函数类似,其作用也是获取按键信息,并且也是在conio.h中定义。不同之处在于,_getch()函数不会在控制台中显示按键信息,而getche()函数会在控制台中显示按键信息

getchar()函数的作用也是获取按键信息,该函数在stdio.h中定义。_getch()函数和_getche()函数是直接从键盘上获取按键信息,getchar()函数是从控制台输入缓冲区中获取按键信息,所以只有当按下了回车按键后,getchar()函数才会开始获取字符信息


总之

1._getche()和getchar()都是阻塞性函数
2._getche()会在控制台显示按键信息 _getch()不会显示按键信息
3._getch()无需按下回车即可获取按键消息 getchar()需要按回车才会开始获取字符信息
4. _kbhit()函数能检测键盘输入但是没有阻塞性

源自-C++类与对象项目

相关文章:

  • C++ 类与对象
  • (转) Android中ViewStub组件使用
  • C++ 构造函数与析构函数
  • MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序...
  • C++ this指针 与 类的继承
  • OpenGL_Qt学习笔记之_07(闪烁的星星)
  • C++ 继承机制中的构造器与析构器
  • C#数组
  • C++ 访问控制
  • ASA842配置内网DNS欺骗测试
  • C++ 覆盖方法与重载方法
  • Ubuntu 12.04 ping 响应慢
  • C++ 静态属性和静态方法
  • C++ this指针与静态属性的关系
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • 【347天】每日项目总结系列085(2018.01.18)
  • Centos6.8 使用rpm安装mysql5.7
  • ES6 学习笔记(一)let,const和解构赋值
  • JAVA SE 6 GC调优笔记
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • PhantomJS 安装
  • v-if和v-for连用出现的问题
  • vue数据传递--我有特殊的实现技巧
  • 计算机在识别图像时“看到”了什么?
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 王永庆:技术创新改变教育未来
  • Nginx实现动静分离
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 如何在招聘中考核.NET架构师
  • ​io --- 处理流的核心工具​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #define与typedef区别
  • #微信小程序:微信小程序常见的配置传值
  • $L^p$ 调和函数恒为零
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (js)循环条件满足时终止循环
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Google的Objective-C编码规范
  • (转)创业的注意事项
  • (转)大型网站的系统架构
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ***利用Ms05002溢出找“肉鸡
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net 路由处理厉害了
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Autowired多个相同类型bean装配问题