c++程序在while循环时通过按键跳出循环

前言:

        分享一下在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;
}

五、总结:

        上述的代码都是我亲自实现过的,并对接口做了注释说明,当然要实现这个功能当然不止这一种方法,比如还可以使用信号量等等。如果有更优的方法希望能够指点指点,让调试的路上顺风顺水!

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这里提供一个基本的独立按键消抖的示例代码,使用while循环来实现: ```c #include <stdio.h> #include <stdbool.h> #include <unistd.h> #define BUTTON_PIN 2 // 按钮引脚 #define DEBOUNCE_DELAY_US 5000 // 消抖延迟,单位:微秒 int main() { bool button_state = false; // 按钮状态 bool last_button_state = false; // 上一次按钮状态 unsigned long last_debounce_time = 0; // 上一次消抖间 int button_press_count = 0; // 按钮按下次数 // 初始化GPIO引脚 // ... while (true) { // 读取按钮状态 button_state = read_button(BUTTON_PIN); // 如果按钮状态发生了改变 if (button_state != last_button_state) { // 记录当前间 last_debounce_time = micros(); } // 如果距离上一次消抖间超过了指定延迟 if ((micros() - last_debounce_time) > DEBOUNCE_DELAY_US) { // 如果当前按钮状态与上一次按钮状态不同 if (button_state != last_button_state) { // 更新按钮状态 last_button_state = button_state; // 如果当前按钮状态为按下状态 if (button_state == true) { printf("Button pressed %d times.\n", ++button_press_count); } } } // 等待一段间再进行下一次循环,可以根据需要调整等待间 usleep(1000); } return 0; } ``` 该示例代码中,使用了一个last_debounce_time变量来记录上一次消抖间,如果距离上一次消抖间超过了指定延迟,就判断当前按钮状态是否与上一次按钮状态不同,如果不同,就更新按钮状态,并根据需要执行相应的操作。在每次循环结束后,等待一段间再进行下一次循环,以避免对CPU资源的浪费。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值