Hellow! 你们好啊!,今天博主来介绍一个C语言练手的小项目--模拟倒计时和Linux中的下载进度条。代码不多就一百多行可以给刚入门的铁子练练手。

注:代码运行环境windows11,IDE大家各有所好,可以编译源代码就行。
目录
[1 前置知识点铺垫--printf的格式匹配符解析](#1 前置知识点铺垫--printf的格式匹配符解析)
[1.1 %d解析](#1.1 %d解析)
[1.2 %s解析](#1.2 %s解析)
[1.3 \r](#1.3 \r)
[2 控制printf打印字符的颜色](#2 控制printf打印字符的颜色)
[3 字符串自动拼接](#3 字符串自动拼接)
[4 %格式匹配符](#4 %格式匹配符)
[5 项目效果](#5 项目效果)
[6 实现代码及接口认识](#6 实现代码及接口认识)
[6.1 process.h文件](#6.1 process.h文件)
[6.2 process.c文件](#6.2 process.c文件)
[6.3 main.c文件](#6.3 main.c文件)
1 前置知识点铺垫--printf的格式匹配符解析
1.1 %d解析
%02d 输出整形宽度为2,默认右对齐,宽度不够补0。
%2d ,宽度不够补空格**,%-2d** 输出内容左对齐,后面补空格。
- 控制内容的左右对齐方式,比如说输出两个字符宽度是对齐到右边还是左边。
1.2 %s解析
%100s输出的字符串长度不够100补空格,- 输出的字符串左对齐默认右对齐。
如**%-100s 从左边开始输出字符串长度不够100字符后面补空格。**
1.3 \r
\r 光标回到打印行开始的位置。从开始位置开始打印那么就会覆盖之前这一行打印的内容。
2 控制printf打印字符的颜色
颜色代码分类
通用属性:
0:重置所有属性
1:高亮/加粗
4:下划线
5:闪烁
7:反显(前景色与背景色互换)
前景色(字体颜色):
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:品红色
36:青色
37:白色
// \033表示打印颜色, 1;5;表示设置颜色属性,31m表示字体颜色
#define RED "\033[1;5;31m"
#define GREEN "\033[32m"
#define Q "\033[0m"
#define RESET "\033[0m"
3 字符串自动拼接
在C语言中如果多个字符串写在同一个行会被自动拼接成一个字符串如
printf("ddd""aaa");--->printf("dddaaa");
const char* ptr="add""ddd";-->ptr="addddd";
4 %格式匹配符
这是C语言printf语句专门用来做格式占位的符号,如"sada%d",就是在这个字符串中给一个整形变量留了一个位置,将来这个整形变量会被当成字符放入到%d占的位置中,scanf中的%d叫做格式匹配符,从输入的字符串中按照整形的格式去匹配合适的字符。如果想打印%字符本身则需要%%转义一下才行,转义就是转变该字符意义。
5 项目效果

6 实现代码及接口认识
6.1 process.h文件
#pragma once
#include<stdio.h>
#include<string.h>
#define RED "\033[1;5;31m"
#define GREEN "\033[32m"
#define RESET "\033[0m"
#define GRENN "\033[32m"
//Total_file_size要下载的文件总大小
//cur_download_size 已经下载的文件大小
FlushDownlowd(double Total_file_size, double cur_download_size);
6.2 process.c文件
cpp
#include"process.h"
//s1 构造缓冲区
const char* sym = "/|-\\";
int index = 0;
char buff[101];
FlushDownlowd(double Total_file_size, double cur_download_size)
{
//初始化缓冲区--因为每次都要重新计算占比然后填入字符到缓冲区
memset(buff,'\0',sizeof(buff));
//计算下载占比
double rate = (cur_download_size / Total_file_size) * 100.0;
//转换为进度条
int ct = (int)rate;
//构造进度条
for (int i = 0; i < ct; i++)
{
buff[i] = '#';
}
//打印进度条
//%100s输出的字符串长度不够100补空格,- 输出的字符串左对齐默认右对齐
//\r光标回到打印行开始的位置。从开始位置开始打印覆盖之前的内容
printf(GREEN"[%-100s][%%%.1lf][%c]\r", buff, rate,sym[index++%4]);
index=index % 4;
//刷新缓冲区
fflush(stdout);
}
6.3 main.c文件
cpp
#include"process.h"
#include <windows.h>
#include<time.h>
void DownLoad(double Total_file_size,double speed)
{
int sp1 = 0;
//s1 记录下载总数
double cur_download_size = 0;
//s2刷新下载进度条
while (cur_download_size<=Total_file_size)
{
//s2刷新下载进度条
FlushDownlowd(Total_file_size, cur_download_size);
//下载成功,刷新然后退出
if (cur_download_size >= Total_file_size)break;
Sleep(50); // 休眠500毫秒
//speed =rand()%10;//随机数模拟网络下载速度
cur_download_size += speed;
}
printf("\n");
}
/*
颜色代码分类
通用属性:
0:重置所有属性
1:高亮/加粗
4:下划线
5:闪烁
7:反显(前景色与背景色互换)
前景色(字体颜色):
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:品红色
36:青色
37:白色
*/
#define RED "\033[1;5;31m"
#define GREEN "\033[32m"
#define Q "\033[0m"
#define RESET "\033[0m"
int main()
{
//printf("%20s","下载中:\n");
//srand(time(0));
////DownLoad(1024.0, 0.0);
////DownLoad(1660.0, 0.5);
int cnt = 3;
printf("倒计时中:\n");
while (cnt)
{
//%02d输出整形宽度为2,默认右对齐,宽度不够补0
//%2d,宽度不够补空格,%-2d输出内容左对齐,后面补空格
//- 控制内容的左右对齐方式,比如说输出两个字符宽度是对齐到右边还是左边
printf(RED"%2d\r", cnt--);
fflush(stdout);
Sleep(1000); // 休眠500毫秒
}
printf(RED"%2d\r", 0);
printf("\n");
printf(RED"倒计时结束,开始下载:\n");
DownLoad(1500.0,2);
return 0;
}
本期收录于博主的专栏------C/C++练手小项目专栏,代码里面都有注释有哪里不理解的小伙伴可以评论区留言。
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:小董 不懂 *( ̄▽ ̄)°★*