
c++程序在while循环时通过按键跳出循环
分享一下在windows或Linux环境下进行c++编程时,想要在程序中增加使用while循环的过程中,人为通过按下某个结束键就能够让程序跳出while循环,这个方法在调试某些demo时非常实用。分享的这个方法肯定不是最好的,也希望能够有前辈能够分享一下其他方法,那么接下去就开始我的调试方法吧。作用:int tolower(int c) 把给定的字母转换成小写字母。如果 c 有相对应的小写字母,则
前言:
分享一下在windows或Linux环境下进行c++编程时,想要在程序中增加使用while循环的过程中,人为通过按下某个结束键就能够让程序跳出while循环,这个方法在调试某些demo时非常实用。分享的这个方法肯定不是最好的,也希望能够有前辈能够分享一下其他方法,那么接下去就开始我的调试方法吧。
一、应用场景:
在调试demo时,当程序在while循环中持续进行某个功能实现时,外界想要介入程序让其退 出while循环,且能继续运行后续代码时,可以使用如下函数组合去实现(Windows环境),下面也会 介绍Linux环境实现方法。Windows操作代码如下:
include <conio.h>
include <ctype.h>
int l_TypedChar = 0;
do
{
//>>
/*** 此处为你需要实现的功能代码 ***/
//<<
if (_kbhit()) //通过判断是否有按键输入,若有,则进入判断
{
l_TypedChar = _getch(); //将按键内容存入l_TypedChar中
}
}
while ('q' != tolower(l_TypedChar)); //判断键入的值是否为q,若为q,则结束循环。
二、公用函数介绍:
tolower()函数:
作用:int tolower(int c) 把给定的字母转换成小写字母。其格式为:
int tolower(int c);
如果 c 有相对应的小写字母,则该函数返回 c 的小写字母,否则 c 保持不变。注意:返回值是一个可 被隐式转换为 char 类型的 int 值。
头文件:#include <ctype.h>
三、Windows函数介绍:
_kbhit()函数:
作用:_kbhit()函数的作用是检查控制台窗口的按键是否被按下。其格式为:
int _kbhit(void);
如果在调用该函数时,有按键被按下,则返回一个非零值,否则该函数的返回值是0。注意:该函数 是一个非阻塞函数,不管有没有按键被按下,该函数都会立即返回。_khbit()函数一般与 _getch()函数组 合使用获取按键信息。
头文件:include <conio.h>
_getch()函数:
作用:_getch()函数的作用是从控制台中获取输入的字符,在获取输入的字符后,并不会在控制台中 显示该字符。该函数的格式为:
int _getch(void);
该函数的返回值是获取到的字符值。注意:_getch()函数是一个阻塞函数,直到有字符输入时才会返 回,所以该函数不会返回错误值。
头文件:include <conio.h>
四、Linux下函数实现:
概述:由于上上述_kbhit, _getch()函数是windows函数,所以在Linux环境需要自己去实现相关接口。接口替 代如下:
getchar()函数:
替代_getch(),其作用及使用方法类似。
kbhit()函数:
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int kbhit(void)
{
struct termios oldt, newt;//oldt, newt用于存储获得的终端参数信息
int ch; //获取终端字符,保存到ch中
int oldf; //存储描述符标志
tcgetattr(STDIN_FILENO, &oldt); //获得标准输入的终端参数,将获得的信息保存在oldt变量
中
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO); //设置标准输入模式、和显示输入字符
tcsetattr(STDIN_FILENO, TCSANOW, &newt);//使用tcsetattr函数将修改后的终端参数设置
到标准输入中
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);//获取标准输入的标志
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);//将标准输入设置成非阻塞IO模式
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);//继续获取标准输入的终端参数
fcntl(STDIN_FILENO, F_SETFL, oldf); //恢复标准输入之前的终端模式
if(ch != EOF) //判断是否获取到有效字符
{
ungetc(ch, stdin); //将ch字符重新放回到标准输入中
return 1;
}
}
使用实例:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
return 1;
}
}
int main(void)
{
int ch = 0;
do
{
printf("-----loop----\n");
usleep(500000);
if(kbhit())
{
ch = getchar();
}
}while('q' != tolower(ch));
printf(" <----while over---->\n");
getchar();
return 0;
}
五、总结:
上述的代码都是我亲自实现过的,并对接口做了注释说明,当然要实现这个功能当然不止这一种方法,比如还可以使用信号量等等。如果有更优的方法希望能够指点指点,让调试的路上顺风顺水!
更多推荐
所有评论(0)