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

文章目录

*
C语言缓冲区

+ 🚀1.输入缓冲区
+
* 🍇模拟登录密码场景
* 🍇从键盘将内容输入到内存的真正过程
* 🍇解决方法:清空输入缓冲区
*
🍉清掉一个字符
🍉清空输入缓冲区所有字符
+ 🚀2.用户C语言级别的缓冲区
+
* 🍇hello world的输出会这样?
* 🍇–手动刷新显示器
+ 🚀3.进度条小程序
+
* 🍇回车与换行的区别
* 🍇进度条小程序代码逐步实现(linux版本)
* 🍇windows版本的进度条小程序

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

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

C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正

; 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;
}

大家可以看一下,下面的代码能否实现我们的需求
看样子是没有什么问题,但是程序结果还是不尽人意

C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
我明明还没确认密码,他就说密码错误,登陆失败,程序错误的原因就 跟C语言的输入缓冲区有关

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

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

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

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;
}

C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
🍉清空输入缓冲区所有字符

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

C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
还是因为 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;
}

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

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

🍇hello world的输出会这样?

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

#include
#include
int main()
{
  printf("hello world\n");
  sleep(1);
  return 0;
}

#include
#include
int main()
{
  printf("hello world");
  sleep(1);
  return 0;
}

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

答案:

  • 1–输出hello world,再等待了一秒
  • 2–等待了一秒,输出了hello world

🍇–手动刷新显示器

没错,第二段代码的输出结果和我们想的差别很大,难道是程序执行的顺序是先执行 sleep(1),再执行 printf("hello world")
当然这是不可能的,因为上述代码是C语言的顺序结构 printf("hello world")已经执行,只是数据没有立即刷新到显示器当中,字符暂时被保存在了用户C语言级别的缓冲区当中。知道程序结束之前才刷新到显示器
解决方法: 手动刷新显示器

C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
#include
#include
int main()
{
  printf("hello world");
  fflush(stdout);
  sleep(1);
  return 0;
}

🚀3.进度条小程序

效果如下:

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

; 🍇回车与换行的区别

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

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

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

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

思路:

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

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

#include
#include

int main()
{
  char str[101] = {'\0'};
  int num = 0;
  while(num < 100)
  {
    str[num] = '=';
    printf("\r[%-100s]",str);

    fflush(stdout);
    usleep(50000);

    ++num;
  }
  printf("\n");
  return 0;
}

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

加上百分比进度条

#include
#include

int main()
{
  char str[101] = {'\0'};
  int num = 0;
  while(num < 100)
  {
    str[num] = '=';
    printf("\r[%-100s][%3d%%]",str,num+1);

    fflush(stdout);
    usleep(50000);

    ++num;
  }
  printf("\n");
  return 0;
}

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

加上程序在运行中的标志

#include
#include

int main()
{
  char str[101] = {'\0'};
  int num = 0;
  const char* p = "|/-\\";
  while(num < 100)
  {
    str[num] = '=';
    printf("\r[%-100s][%3d%%][%c]",str,num+1,p[num%4]);

    fflush(stdout);
    usleep(50000);

    ++num;
  }
  printf("\n");
  return 0;
}

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

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

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

int main()
{
  char str[101] = {'\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]);

    fflush(stdout);
    usleep(50000);

    ++num;
  }
  printf("\n");
  return 0;
}

🍇windows版本的进度条小程序

效果如下:

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

#include
void color(short x)
{
    if(x>=0 && x15)
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
    else
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

int main()
{
  char str[101] = {'\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]);

    fflush(stdout);
    Sleep(50);

    ++num;
  }
  printf("\n");
  return 0;
}

颜色列表:

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

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

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

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

Original: https://blog.csdn.net/m0_64361907/article/details/127606513
Author: 龟龟不断向前
Title: C语言实现windows,linux双版本下的进度条小程序,快来试一试吧

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/664233/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球