字符动画库 For C
简介
字符动画库 For C 是一个基于C语言标准库开发的轻量级终端字符动画库,专门用于在命令行界面中创建流畅的字符加载动画和对话框效果,为C语言开发者提供了简单易用的终端动画解决方案,让命令行程序拥有更丰富的视觉体验!
主要特性
✨ 核心优势
- 🪶 超轻量级 - 仅依赖C标准库,无额外依赖
- ⚡ 高性能 - 优化的动画渲染逻辑
- 🔧 高度可定制 - 支持手动修改动画帧和参数
- 🛡️ 稳定可靠 - 内置空指针检查,增强程序健壮性
功能特色
🎯 已完成功能
- ✅ 字符加载动画显示
- ✅ 支持多种动画样式
- ✅ 可调节帧间隔时间
- ✅ 自定义动画总时长
- ✅ 智能对话框输出
- ✅ 自动清屏和光标控制
- ✅ 空指针安全检测
技术特点
- 🎮 动画控制 - 精确控制动画时长和帧率
- 📝 文本处理 - 智能处理空格和标点符号
- 🖥️ 终端兼容 - 使用ANSI转义码,兼容主流终端
- 🔄 循环动画 - 自动循环播放动画帧序列
快速开始
1. 引入头文件
#include <stdio.h>
#include <unistd.h>
2. 声明函数和全局变量
请将以下内容添加到主函数前。
// 声明函数
void clean(void);
int loading(char *text,int times,float sleeptime);
int textbox(char *name,char *text,float sleeptime);
int loading_text(char *text,int times,float sleeptime);
// 声明全局变量
const char *strings[] = {"|", "/", "—", "\\"};
const int int_len = sizeof(strings) / sizeof(strings[0]);
3. 声明函数内容
请将以下内容添加到主函数后。
int loading(char *text,int times,float sleeptime) { // 加载动画函数
if (text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
for (int i = 0; i < times; i++) {
clean();
printf("\r%s %s",text, strings[i % int_len]);
fflush(stdout);
usleep(sleeptime);
}
clean();
return 0;
}
int loading_text(char *text,int times,float sleeptime) {
if (text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
int TIME_plustime = 100 / times;
int TIME_nowtime = 0;
for (int i = 0; i < times; i++) {
clean();
printf("\r%s %i%%",text, TIME_nowtime);
fflush(stdout);
usleep(sleeptime);
TIME_nowtime += TIME_plustime;
}
clean();
return 0;
}
int textbox(char *name,char *text,float sleeptime) { // 对话框函数
if (name == NULL || text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
int string_len = strlen(text);
printf("\r%s | ",name);
fflush(stdout);
for(int n = 0; n < string_len; n++) {
printf("%c",text[n]);
fflush(stdout);
if (text[n] == ' ') {
usleep(sleeptime * 1.5);
} else {
usleep(sleeptime);
}
}
return 0;
}
void clean(void) { // 清空当前行终端函数
printf("\033[2K");
}
4.在您的程序中调用动画函数
// 普通加载动画
loading("提示文本内容",动画时长,帧间隔时长);
第一项传入的参数须为char*类型字符串。
第二项传入的参数须为int类型整数。
第三项传入的参数须为double类型浮点数。
// 百分比加载动画
loading_text("提示文本内容",动画时长,帧间隔时长);
第一项传入的参数须为char*类型字符串。
第二项传入的参数须为int类型整数。
第三项传入的参数须为double类型浮点数。
// 对话框输出
textbox("提示文本内容", "文本内容", 帧间隔时长);
第一项传入的参数须为char*类型字符串。
第二项传入的参数须为字符串。char*类型
第三项传入的参数须为double类型浮点数。
文件
v0.3 新特性
- 💬 新增百分比进度函数 - 支持显示百分比进度效果
示例代码(演示程序)
// 引入头文件
#include <stdio.h>
#include <unistd.h>
// 声明函数
void clean(void);
int loading(char *text,int times,float sleeptime);
int textbox(char *name,char *text,float sleeptime);
int loading_text(char *text,int times,float sleeptime);
// 声明全局变量
const char *strings[] = {"|", "/", "—", "\\"}; // 加载动画放在这里了,\n换行为了美观
const int int_len = sizeof(strings) / sizeof(strings[0]);// 计算数组长度
// 主程序
int main(void) {
loading_text("加载中...",10,0.2); // 这里可以修改文字内容动画显示秒数,默认10秒
sleep(1);
int number = loading("加载中...",10,0.1); // 这里可以修改文字内容动画显示秒数,默认10秒
if (number == 0) { // 判断返回值
printf("\r加载成功!");
sleep(1);
clean();
number = textbox("DeepSeek","总结 :这个错误通常在系统策略限制后台传输时发生,在企业环境中比较常见。",0.1); // 这里可以修改文字内容
if (number == 0) { // 判断返回值
return 0;
} else {
printf("\r输出失败!");
return 2;
}
} else {
printf("\r加载失败!");
return 1;
}
}
// 加载动画函数
int loading_text(char *text,int times,float sleeptime) {
if (text == NULL) { // 判断空指针
return 1;
}
sleeptime = sleeptime * 1000000; // 转换进制
int TIME_plustime = 100 / times; // 计算每次增加的时间
int TIME_nowtime = 0;
for (int i = 0; i < times; i++) { // 伪计时
clean();
printf("\r%s %i%%",text, TIME_nowtime); // \r 回到行首
fflush(stdout); // 立即刷新输出
usleep(sleeptime); // 等待
TIME_nowtime += TIME_plustime; // 增加时间
}
clean();
return 0;
}
// 加载动画函数
int loading(char *text,int times,float sleeptime) {
if (text == NULL) { // 判断空指针
return 1;
}
sleeptime = sleeptime * 1000000; // 转换进制
for (int i = 0; i < times; i++) { // 伪计时
clean();
printf("\r%s %s",text, strings[i % int_len]); // \r 回到行首
fflush(stdout); // 立即刷新输出
usleep(sleeptime); // 等待
}
clean();
return 0;
}
// 对话框函数
int textbox(char *name,char *text,float sleeptime) {
if (name == NULL || text == NULL) { // 判断空指针
return 1;
}
sleeptime = sleeptime * 1000000; // 转换进制
int string_len = strlen(text); // 计算长度
printf("\r%s | ",name); // 输出昵称
fflush(stdout);
for(int n = 0; n < string_len; n++) {
printf("%c",text[n]); // 输出单个字符
fflush(stdout); // 立即刷新输出
// 根据字符类型设置不同的延迟
if (text[n] == ' ') {
// 标点和空格处停顿时间加倍
usleep(sleeptime * 1.5);
} else {
usleep(sleeptime);
} // 模拟停顿
}
return 0;
}
// 清空当前行终端函数
void clean(void) {
printf("\033[2K"); // \033[2K 清空当前行
}
开发代码(复制到你自己的程序)
// 引入头文件
#include <stdio.h>
#include <unistd.h>
// 声明函数
void clean(void);
int loading(char *text,int times,float sleeptime);
int textbox(char *name,char *text,float sleeptime);
int loading_text(char *text,int times,float sleeptime);
// 声明全局变量
const char *strings[] = {"|", "/", "—", "\\"};
const int int_len = sizeof(strings) / sizeof(strings[0]);
int loading_text(char *text,int times,float sleeptime) {
if (text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
int TIME_plustime = 100 / times;
int TIME_nowtime = 0;
for (int i = 0; i < times; i++) {
clean();
printf("\r%s %i%%",text, TIME_nowtime);
fflush(stdout);
usleep(sleeptime);
TIME_nowtime += TIME_plustime;
}
clean();
return 0;
}
int loading(char *text,int times,float sleeptime) { // 加载动画函数
if (text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
for (int i = 0; i < times; i++) {
clean();
printf("\r%s %s",text, strings[i % int_len]);
fflush(stdout);
usleep(sleeptime);
}
clean();
return 0;
}
int textbox(char *name,char *text,float sleeptime) { // 对话框函数
if (name == NULL || text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
int string_len = strlen(text);
printf("\r%s | ",name);
fflush(stdout);
for(int n = 0; n < string_len; n++) {
printf("%c",text[n]);
fflush(stdout);
if (text[n] == ' ') {
usleep(sleeptime * 1.5);
} else {
usleep(sleeptime);
}
}
return 0;
}
void clean(void) { // 清空当前行终端函数
printf("\033[2K"); // \033[2K 清空当前行
}
v0.2 新特性
- 🎨 项目重命名 - 更改为"字符动画库 For C"
- 💬 新增对话框函数 - 支持逐字输出的对话框效果
- 🔒 增强安全性 - 添加空指针判断
- 🔄 优化动画逻辑 - 支持用户自定义动画帧
- 🧹 改进清屏 - 仅清空当前行,提升用户体验
示例代码(演示程序)
// 引入头文件
#include <stdio.h>
#include <unistd.h>
// 声明函数
void clean(void);
int loading(char *text,int times,float sleeptime);
int textbox(char *name,char *text,float sleeptime);
// 声明全局变量
const char *strings[] = {"|", "/", "—", "\\"}; // 加载动画放在这里了,\n换行为了美观
const int int_len = sizeof(strings) / sizeof(strings[0]);// 计算数组长度
// 主程序
int main(void) {
int number = loading("加载中...",13,0.2); // 这里可以修改文字内容动画显示秒数,默认10秒
if (number == 0) { // 判断返回值
printf("\r加载成功!");
sleep(1);
clean();
number = textbox("DeepSeek","总结 :这个错误通常在系统策略限制后台传输时发生,在企业环境中比较常见。",0.1); // 这里可以修改文字内容
if (number == 0) { // 判断返回值
return 0;
} else {
printf("\r输出失败!");
return 2;
}
} else {
printf("\r加载失败!");
return 1;
}
}
// 加载动画函数
int loading(char *text,int times,float sleeptime) {
if (text == NULL) { // 判断空指针
return 1;
}
sleeptime = sleeptime * 1000000; // 转换进制
for (int i = 0; i < times; i++) { // 伪计时
clean();
printf("\r%s %s",text, strings[i % int_len]); // \r 回到行首
fflush(stdout); // 立即刷新输出
usleep(sleeptime); // 等待
}
clean();
return 0;
}
// 对话框函数
int textbox(char *name,char *text,float sleeptime) {
if (name == NULL || text == NULL) { // 判断空指针
return 1;
}
sleeptime = sleeptime * 1000000; // 转换进制
int string_len = strlen(text); // 计算长度
printf("\r%s | ",name); // 输出昵称
fflush(stdout);
for(int n = 0; n < string_len; n++) {
printf("%c",text[n]); // 输出单个字符
fflush(stdout); // 立即刷新输出
// 根据字符类型设置不同的延迟
if (text[n] == ' ') {
// 标点和空格处停顿时间加倍
usleep(sleeptime * 1.5);
} else {
usleep(sleeptime);
} // 模拟停顿
}
return 0;
}
// 清空当前行终端函数
void clean(void) {
printf("\033[2K"); // \033[2K 清空当前行
}
开发代码(复制到你自己的程序)
// 声明函数
void clean(void);
int loading(char *text,int times,float sleeptime);
int textbox(char *name,char *text,float sleeptime);
// 声明全局变量
const char *strings[] = {"|", "/", "—", "\\"};
const int int_len = sizeof(strings) / sizeof(strings[0]);
int loading(char *text,int times,float sleeptime) { // 加载动画函数
if (text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
for (int i = 0; i < times; i++) {
clean();
printf("\r%s %s",text, strings[i % int_len]);
fflush(stdout);
usleep(sleeptime);
}
clean();
return 0;
}
int textbox(char *name,char *text,float sleeptime) { // 对话框函数
if (name == NULL || text == NULL) {
return 1;
}
sleeptime = sleeptime * 1000000;
int string_len = strlen(text);
printf("\r%s | ",name);
fflush(stdout);
for(int n = 0; n < string_len; n++) {
printf("%c",text[n]);
fflush(stdout);
if (text[n] == ' ') {
usleep(sleeptime * 1.5);
} else {
usleep(sleeptime);
}
}
return 0;
}
void clean(void) { // 清空当前行终端函数
printf("\033[2K"); // \033[2K 清空当前行
}
v0.1
示例代码(演示程序)
// 引入头文件
#include <stdio.h>
#include <unistd.h>
// 声明函数
void clean(void);
int loading(int times,int sleeptime);
// 声明全局变量
const char *strings[] = {"|\n", "/\n", "-\n", "\\\n"}; // 加载动画放在这里了,\n换行为了美观
// 主程序
int main(void) {
loading(10,1); // 这里可以修改动画显示秒数,默认10秒
return 0;
}
int loading(int times,int sleeptime) {
int sum = 0;
for (int i = 0; i < times; i++) { // 伪计时
clean();
printf("%s", strings[sum]); // 输出动画
sum++;
if(sum == 4){ // 重置动画
sum = 0;
}
sleep(sleeptime); // 等待一秒
}
return 0;
}
// 清空终端
void clean(void) {
printf("\033[2J\033[H");
}
开发代码(复制到你自己的程序)
void clean(void);
int loading(int times,int sleeptime);
const char *strings[] = {"|\n", "/\n", "-\n", "\\\n"}; // 加载动画放在这里了,\n换行为了美观
int loading(int times,int sleeptime) {
int sum = 0;
for (int i = 0; i < times; i++) {
clean();
printf("%s", strings[sum]);
sum++;
if(sum == 4){ // 重置动画
sum = 0;
}
sleep(sleeptime);
}
return 0;
}
void clean(void) {
printf("\033[2J\033[H");
}