200字
[开源] 字符动画库 For C - C语言实现的一个终端字符动画库
2025-11-12
2025-12-19

字符动画库 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");
}

评论