• C语言实现windows,linux双版本下的进度条小程序,快来试一试吧


    前言
    👻作者龟龟不断向前
    👻简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
    👻专栏C++初阶知识点

    👻工具分享

    1. 刷题: 牛客网 leetcode
    2. 笔记软件:有道云笔记
    3. 画图软件:Xmind(思维导图) diagrams(流程图)

    在这里插入图片描述

    如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正

    C语言缓冲区

    🚀1.输入缓冲区

    🍇模拟登录密码场景

    假如现在你有一个登录密码场景的需求:

    1. 输入密码12345678
    2. 确认密码(Y/N)
    3. Y–密码正确,登录成功
    4. N–密码错误,登陆失败
    #include
    
    int main()
    {
      char str[20];
      char input = 0;
      printf("请输入你的密码\n");
      scanf("%s",str);
        
      printf("请确认你的密码(Y/N)\n");
      input = getchar();
        
      if(input == 'Y')
        printf("密码正确,登录成功\n");
      else 
        printf("密码错误,登陆失败\n");
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    大家可以看一下,下面的代码能否实现我们的需求

    看样子是没有什么问题,但是程序结果还是不尽人意

    在这里插入图片描述

    我明明还没确认密码,他就说密码错误,登陆失败,程序错误的原因就跟C语言的输入缓冲区有关

    🍇从键盘将内容输入到内存的真正过程

    在这里插入图片描述

    在这里插入图片描述

    scanf的设计就是已空格和\n为分隔,所以\n不会算进str的内容,而是留在了输入缓冲区

    再输入input时,由于输入缓冲区有内容还没轮到我们输入,输入缓冲区的\n就留给了input


    🍇解决方法:清空输入缓冲区
    🍉清掉一个字符

    输入缓冲区里面有内容,导致input并不是我们输入的值,所以咱们可以在前面加一个getchar(),用来吃掉\n

    #include
    
    int main()
    {
      char str[20];
      char input = 0;
      printf("请输入你的密码\n");
      scanf("%s",str);
        
      printf("请确认你的密码(Y/N)\n");
      input = getchar();
        
      if(input == 'Y')
        printf("密码正确,登录成功\n");
      else 
        printf("密码错误,登陆失败\n");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    🍉清空输入缓冲区所有字符

    上述代码有一个问题,当我的密码输入123456 xxx(中间留有空格),程序结构又不尽人意了

    在这里插入图片描述

    还是因为scanf的设计就是已空格和\n为分隔,那些 空格xxx\n 都留在了输入缓冲区,如果我们想要清除他们可以

    使用循环清除这些字符

    #include
    
    int main()
    {
      char str[20];
      char input = 0;
      printf("请输入你的密码\n");
      scanf("%s",str);
      printf("请确认你的密码(Y/N)\n");
      while((input = getchar()) != '\n')
      {
        ;
      }
      input = getchar();
      if(input == 'Y')
        printf("密码正确,登录成功\n");
      else 
        printf("密码错误,登陆失败\n");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述


    🚀2.用户C语言级别的缓冲区

    🍇hello world的输出会这样?

    环境:linux系统下gcc编译器演示 ,windows环境下是不一样的效果

    #include
    #include
    int main()
    {
      printf("hello world\n");
      sleep(1);
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    #include
    #include
    int main()
    {
      printf("hello world");
      sleep(1);
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    大家觉得上述两段代码的输出结果分别是什么呢?

    答案:

    • 1–输出hello world,再等待了一秒
    • 2–等待了一秒,输出了hello world
    🍇–手动刷新显示器

    没错,第二段代码的输出结果和我们想的差别很大,难道是程序执行的顺序是先执行sleep(1),再执行printf("hello world")

    当然这是不可能的,因为上述代码是C语言的顺序结构

    printf("hello world")已经执行,只是数据没有立即刷新到显示器当中,字符暂时被保存在了用户C语言级别的缓冲区当中。知道程序结束之前才刷新到显示器

    解决方法:手动刷新显示器

    在这里插入图片描述

    #include
    #include
    int main()
    {
      printf("hello world");
      fflush(stdout);
      sleep(1);
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    🚀3.进度条小程序

    效果如下:

    在这里插入图片描述

    🍇回车与换行的区别

    很多同学都认为回车和换行是一回事,在现实生活中的某些情况确实如此,但在语言角度上:

    换行\n:新起一行

    回车\r:使光标回到一行的开始位置

    🍇进度条小程序代码逐步实现(linux版本)

    在这里插入图片描述

    思路:

    1. 申请一个101字节大小的字符数组(最后一个位置要放\0)
    2. 首先将内容都置为\0,以免之后我们的手动设置\0
    3. 循环100次,从左向右,每一次循环将字符数组的一个内容设置为=,然后回车(回到一行的起始行),再打印输出字符串
    4. 设置百分比,运行标志,颜色即可

    咱们使用linux版本细节讲解:

    #include
    #include
    
    int main()
    {
      char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
      int num = 0; 
      while(num < 100)
      {
        str[num] = '=';
        printf("\r[%-100s]",str);//由于没有\n,stdout没有刷新
        //先回车再输出
        fflush(stdout);//手动刷新屏幕
        usleep(50000);//单位是微秒
        //咱们使总时间为5秒
        ++num;
      }
      printf("\n");
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    我们设计的是5秒钟将进度条跑完,那么100次循环,一次循环的时间就是0.05秒–50毫秒–50000微秒

    usleep的单位就是微秒


    加上百分比进度条

    #include
    #include
    
    int main()
    {
      char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
      int num = 0; 
      while(num < 100)
      {
        str[num] = '=';
        printf("\r[%-100s][%3d%%]",str,num+1);//由于没有\n,stdout没有刷新
        //先回车再输出
        fflush(stdout);//手动刷新屏幕
        usleep(50000);//单位是微秒
        //咱们使总时间为5秒
        ++num;
      }
      printf("\n");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    输出%我们要两个%%才行


    加上程序在运行中的标志

    #include
    #include
    
    int main()
    {
      char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
      int num = 0; 
      const char* p = "|/-\\";
      while(num < 100)
      {
        str[num] = '=';
        printf("\r[%-100s][%3d%%][%c]",str,num+1,p[num%4]);//由于没有\n,stdout没有刷新
        //先回车再输出
        fflush(stdout);//手动刷新屏幕
        usleep(50000);//单位是微秒
        //咱们使总时间为5秒
        ++num;
      }
      printf("\n");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    表示\,需要两个\

    \ ,|,-,/这些字符连续依次打印的时候即可实现该效果


    配个颜色,配色列表如下,咱们就修改一下字体颜色就好

    在这里插入图片描述

    #include
    #include
    
    int main()
    {
      char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
      int num = 0; 
      const char* p = "|/-\\";//表示程序在进行
      //注意\是识别转义字符的标志,想打印\要两个反斜杠
      while(num < 100)
      {
        str[num] = '=';
        printf("\r\033[32m[%-100s][%3d%%][%c]",str,num+1,p[num%4]);//由于没有\n,stdout没有刷新
        //先回车再输出
        fflush(stdout);//手动刷新屏幕
        usleep(50000);//单位是微秒
        //咱们使总时间为5秒
        ++num;
      }
      printf("\n");
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    🍇windows版本的进度条小程序

    效果如下:
    在这里插入图片描述

    #include
    #include
    
    #include //设置字体颜色的函数
    void color(short x)//自定义函根据参数改变颜色 
    {
        if(x>=0 && x<=15)//参数在0-15的范围颜色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);//只有一个参数,改变字体颜色 
        else//默认的颜色白色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
    }
    
    int main()
    {
      char str[101] = {'\0'};//每个位置都放\0,这样就不需要手动控制
      int num = 0; 
      const char* p = "|/-\\";//表示程序在进行
      //注意\是识别转义字符的标志,想打印\要两个反斜杠
      color(2);
      while(num < 100)
      {
        str[num] = '=';
        printf("\r\033[32m[%-100s][%3d%%][%c]",str,num+1,p[num%4]);//由于没有\n,stdout没有刷新
        //先回车再输出
        fflush(stdout);//手动刷新屏幕
        Sleep(50);//单位是微秒
        //咱们使总时间为5秒
        ++num;
      }
      printf("\n");
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    颜色列表:

    在这里插入图片描述

    上述的color函数的实现来自于此文章:(53条消息) C语言教你怎么改变字体颜色_nacrt的博客-CSDN博客_c语言颜色函数color怎么使用

    本篇文章就到这,希望可以让大家感受到乐趣,咱们下期见。

    点赞

  • 相关阅读:
    霍尔效应传感器的典型应用场合解析
    《定时执行专家》官方版介绍 —— 毫秒级精度、多线程、专业级的定时任务执行软件
    strongswan:configure: error: OpenSSL Crypto library not found
    QMI8658芯片I2C驱动开发指南
    EXSI 实用指南 2024 -编译环境 Mac OS 安装篇(一)
    springAOP讲解
    HarmonyOS-MPChart绘制一条虚实相接的曲线
    k8s暴露集群内和集群外服务的方法
    NFT 推荐|Funguys 王国作品集第一弹
    快收下这份拼接视频方法攻略,制作出你想要的视频
  • 原文地址:https://blog.csdn.net/m0_64361907/article/details/127606513