C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
Posted 龟龟不断向前
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现windows,linux双版本下的进度条小程序,快来试一试吧相关的知识,希望对你有一定的参考价值。
文章目录
前言
👻作者:龟龟不断向前
👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏:C++初阶知识点👻工具分享:
如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正
C语言缓冲区
🚀1.输入缓冲区
🍇模拟登录密码场景
假如现在你有一个登录密码场景的需求:
- 输入密码12345678
- 确认密码(Y/N)
- Y–密码正确,登录成功
- N–密码错误,登陆失败
#include<stdio.h>
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语言的输入缓冲区有关
🍇从键盘将内容输入到内存的真正过程
scanf
的设计就是已空格和\\n
为分隔,所以\\n不会算进str
的内容,而是留在了输入缓冲区再输入
input
时,由于输入缓冲区有内容还没轮到我们输入,输入缓冲区的\\n
就留给了input
🍇解决方法:清空输入缓冲区
🍉清掉一个字符
输入缓冲区里面有内容,导致
input
并不是我们输入的值,所以咱们可以在前面加一个getchar()
,用来吃掉\\n
#include<stdio.h>
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;
🍉清空输入缓冲区所有字符
上述代码有一个问题,当我的密码输入123456 xxx(中间留有空格),程序结构又不尽人意了
还是因为
scanf
的设计就是已空格和\\n
为分隔,那些 空格xxx\\n 都留在了输入缓冲区,如果我们想要清除他们可以使用循环清除这些字符
#include<stdio.h>
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;
🚀2.用户C语言级别的缓冲区
🍇hello world的输出会这样?
环境:
linux
系统下gcc
编译器演示 ,windows
环境下是不一样的效果
#include<stdio.h>
#include<unistd.h>
int main()
printf("hello world\\n");
sleep(1);
return 0;
#include<stdio.h>
#include<unistd.h>
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语言级别的缓冲区当中。知道程序结束之前才刷新到显示器解决方法:手动刷新显示器
#include<stdio.h>
#include<unistd.h>
int main()
printf("hello world");
fflush(stdout);
sleep(1);
return 0;
🚀3.进度条小程序
效果如下:
🍇回车与换行的区别
很多同学都认为回车和换行是一回事,在现实生活中的某些情况确实如此,但在语言角度上:
换行\\n:新起一行
回车\\r:使光标回到一行的开始位置
🍇进度条小程序代码逐步实现(linux版本)
思路:
- 申请一个101字节大小的字符数组(最后一个位置要放\\0)
- 首先将内容都置为\\0,以免之后我们的手动设置\\0
- 循环100次,从左向右,每一次循环将字符数组的一个内容设置为
=
,然后回车(回到一行的起始行),再打印输出字符串- 设置百分比,运行标志,颜色即可
咱们使用linux
版本细节讲解:
#include<stdio.h>
#include<unistd.h>
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;
我们设计的是5秒钟将进度条跑完,那么100次循环,一次循环的时间就是0.05秒–50毫秒–50000微秒
usleep
的单位就是微秒
加上百分比进度条
#include<stdio.h>
#include<unistd.h>
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;
输出%我们要两个%%才行
加上程序在运行中的标志
#include<stdio.h>
#include<unistd.h>
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;
表示\\,需要两个\\
当
\\
,|
,-
,/
这些字符连续依次打印的时候即可实现该效果
配个颜色,配色列表如下,咱们就修改一下字体颜色就好
#include<stdio.h>
#include<unistd.h>
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;
🍇windows版本的进度条小程序
效果如下:
#include<stdio.h>
#include<windows.h>
#include <windows.h>//设置字体颜色的函数
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;
颜色列表:
上述的color函数的实现来自于此文章:(53条消息) C语言教你怎么改变字体颜色_nacrt的博客-CSDN博客_c语言颜色函数color怎么使用
本篇文章就到这,希望可以让大家感受到乐趣,咱们下期见。
以上是关于C语言实现windows,linux双版本下的进度条小程序,快来试一试吧的主要内容,如果未能解决你的问题,请参考以下文章
windows下的c语言和linux 下的c语言以及C标准库和系统API