From b2b03b8589e391003b6fffa8ab2db72ca422f3f1 Mon Sep 17 00:00:00 2001 From: rangersly <2281598291@qq.com> Date: Fri, 16 May 2025 20:41:41 +0800 Subject: [PATCH] c ansi complete --- program/c_cpp/universal/ansi.md | 85 ++++++++++++++------------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/program/c_cpp/universal/ansi.md b/program/c_cpp/universal/ansi.md index 54dbf24..309d626 100644 --- a/program/c_cpp/universal/ansi.md +++ b/program/c_cpp/universal/ansi.md @@ -3,6 +3,12 @@ ## 在代码中检测是否支持ANSI C `#if __STDC__ == 1` +## index +- [文本样式控制](#文本样式控制) +- [color](#color) +- [光标控制](#光标控制) +- [example](#example) + - [进度条](#进度条) --- ## **文本样式控制** @@ -20,7 +26,9 @@ --- -## **前景色** +## **color** + +- **前景色** | 转义码 | 颜色 | 转义码(亮色) | |---------------|-----------|----------------| | `\033[30m` | 黑色 | `\033[90m` | @@ -32,9 +40,7 @@ | `\033[36m` | 青色 | `\033[96m` | | `\033[37m` | 白色 | `\033[97m` | ---- - -## **背景色** +- **背景色** | 转义码 | 颜色 | 转义码(亮色) | |---------------|-----------|----------------| | `\033[40m` | 黑色 | `\033[100m` | @@ -46,18 +52,12 @@ | `\033[46m` | 青色 | `\033[106m` | | `\033[47m` | 白色 | `\033[107m` | ---- - -## **RGB 颜色** +- **RGB 颜色** 如果终端支持 **24-bit 真彩色**,可以使用: ```c printf("\033[38;2;;;m"); // 设置前景色(RGB) printf("\033[48;2;;;m"); // 设置背景色(RGB) ``` -**示例:** -```c -printf("\033[38;2;255;100;0m这是橙红色文字\033[0m\n"); -``` --- @@ -78,50 +78,37 @@ printf("\033[38;2;255;100;0m这是橙红色文字\033[0m\n"); | `\033[s` | 保存光标位置 | | `\033[u` | 恢复光标位置 | +--- + ## **example** -``` + +### **进度条** +```c #include +#include // 用于 sleep 函数 -#if __STDC__ != 1 - #error "NO ansi !" -#endif +// 生成 RGB 前景色 ANSI 代码(需确保缓冲区足够大) +#define GET_RGB(buf,size,r,g,b) do{snprintf(buf, (size), "\033[38;2;%d;%d;%dm", (r), (g), (b));}while(0) -int main(void) { - printf("-----TEXT STYLE-----\n"); - printf("\033[0m\\033[0m\033[0m\n"); - printf("\033[1m\\033[1m\033[0m\n"); - printf("\033[2m\\033[2m\033[0m\n"); - printf("\033[3m\\033[3m\033[0m\n"); - printf("\033[4m\\033[4m\033[0m\n"); - printf("\033[5m\\033[5m\033[0m\n"); - printf("\033[6m\\033[6m\033[0m\n"); - printf("\033[7m\\033[7m\033[0m\n"); - printf("\033[8m\\033[8m\033[0m\n"); - printf("\033[9m\\033[9m\033[0m\n"); +void update_progress(int percent) { + char color[32]; + // 根据进度改变颜色(红色 -> 黄色 -> 绿色) + GET_RGB(color, sizeof(color), 255 * (100 - percent) / 100, 255 * percent / 100, 0); + // 绘制进度条 + printf("\r%s[", color); + for (int i = 0; i < 50; i++) + printf(i < percent / 2 ? "█" : " "); + printf("] %d%%\033[0m", percent); + fflush(stdout); // 强制刷新输出 +} - printf("\n-----COLOR-----\n"); - printf("\033[30m\\033[30m\033[0m - \033[90m\\033[90m\033[0m\n"); - printf("\033[31m\\033[31m\033[0m - \033[91m\\033[91m\033[0m\n"); - printf("\033[32m\\033[32m\033[0m - \033[92m\\033[92m\033[0m\n"); - printf("\033[33m\\033[33m\033[0m - \033[93m\\033[93m\033[0m\n"); - printf("\033[34m\\033[34m\033[0m - \033[94m\\033[94m\033[0m\n"); - printf("\033[35m\\033[35m\033[0m - \033[95m\\033[95m\033[0m\n"); - printf("\033[36m\\033[36m\033[0m - \033[96m\\033[96m\033[0m\n"); - printf("\033[37m\\033[37m\033[0m - \033[97m\\033[97m\033[0m\n"); - printf("\033[38;2;112;223;234m\\033[38;2;112;223;234m\033[0m\n"); - - printf("\033[40m\\033[40m\033[0m - \033[100m\\033[100m\033[0m\n"); - printf("\033[41m\\033[41m\033[0m - \033[101m\\033[101m\033[0m\n"); - printf("\033[42m\\033[42m\033[0m - \033[102m\\033[102m\033[0m\n"); - printf("\033[43m\\033[43m\033[0m - \033[103m\\033[103m\033[0m\n"); - printf("\033[44m\\033[44m\033[0m - \033[104m\\033[104m\033[0m\n"); - printf("\033[45m\\033[45m\033[0m - \033[105m\\033[105m\033[0m\n"); - printf("\033[46m\\033[46m\033[0m - \033[106m\\033[106m\033[0m\n"); - printf("\033[47m\\033[47m\033[0m - \033[107m\\033[107m\033[0m\n"); - printf("\033[48;2;112;223;234m\\033[48;2;112;223;234m\033[0m\n"); - - printf("\033[0m\n"); +int main() { + for (int i = 0; i <= 100; i++) { + update_progress(i); + usleep(50000); + } + putchar('\n'); return 0; } ```