c ansi complete

This commit is contained in:
rangersly 2025-05-16 20:41:41 +08:00
parent e558ee3788
commit b2b03b8589

View File

@ -3,6 +3,12 @@
## 在代码中检测是否支持ANSI C ## 在代码中检测是否支持ANSI C
`#if __STDC__ == 1` `#if __STDC__ == 1`
## index
- [文本样式控制](#文本样式控制)
- [color](#color)
- [光标控制](#光标控制)
- [example](#example)
- [进度条](#进度条)
--- ---
## **文本样式控制** ## **文本样式控制**
@ -20,7 +26,9 @@
--- ---
## **前景色** ## **color**
- **前景色**
| 转义码 | 颜色 | 转义码(亮色) | | 转义码 | 颜色 | 转义码(亮色) |
|---------------|-----------|----------------| |---------------|-----------|----------------|
| `\033[30m` | 黑色 | `\033[90m` | | `\033[30m` | 黑色 | `\033[90m` |
@ -32,9 +40,7 @@
| `\033[36m` | 青色 | `\033[96m` | | `\033[36m` | 青色 | `\033[96m` |
| `\033[37m` | 白色 | `\033[97m` | | `\033[37m` | 白色 | `\033[97m` |
--- - **背景色**
## **背景色**
| 转义码 | 颜色 | 转义码(亮色) | | 转义码 | 颜色 | 转义码(亮色) |
|---------------|-----------|----------------| |---------------|-----------|----------------|
| `\033[40m` | 黑色 | `\033[100m` | | `\033[40m` | 黑色 | `\033[100m` |
@ -46,18 +52,12 @@
| `\033[46m` | 青色 | `\033[106m` | | `\033[46m` | 青色 | `\033[106m` |
| `\033[47m` | 白色 | `\033[107m` | | `\033[47m` | 白色 | `\033[107m` |
--- - **RGB 颜色**
## **RGB 颜色**
如果终端支持 **24-bit 真彩色**,可以使用: 如果终端支持 **24-bit 真彩色**,可以使用:
```c ```c
printf("\033[38;2;<r>;<g>;<b>m"); // 设置前景色RGB printf("\033[38;2;<r>;<g>;<b>m"); // 设置前景色RGB
printf("\033[48;2;<r>;<g>;<b>m"); // 设置背景色RGB printf("\033[48;2;<r>;<g>;<b>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[s` | 保存光标位置 |
| `\033[u` | 恢复光标位置 | | `\033[u` | 恢复光标位置 |
---
## **example** ## **example**
```
### **进度条**
```c
#include <stdio.h> #include <stdio.h>
#include <unistd.h> // 用于 sleep 函数
#if __STDC__ != 1 // 生成 RGB 前景色 ANSI 代码(需确保缓冲区足够大)
#error "NO ansi !" #define GET_RGB(buf,size,r,g,b) do{snprintf(buf, (size), "\033[38;2;%d;%d;%dm", (r), (g), (b));}while(0)
#endif
int main(void) { void update_progress(int percent) {
printf("-----TEXT STYLE-----\n"); char color[32];
printf("\033[0m\\033[0m\033[0m\n"); // 根据进度改变颜色(红色 -> 黄色 -> 绿色)
printf("\033[1m\\033[1m\033[0m\n"); GET_RGB(color, sizeof(color), 255 * (100 - percent) / 100, 255 * percent / 100, 0);
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");
// 绘制进度条
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"); int main() {
printf("\033[30m\\033[30m\033[0m - \033[90m\\033[90m\033[0m\n"); for (int i = 0; i <= 100; i++) {
printf("\033[31m\\033[31m\033[0m - \033[91m\\033[91m\033[0m\n"); update_progress(i);
printf("\033[32m\\033[32m\033[0m - \033[92m\\033[92m\033[0m\n"); usleep(50000);
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"); putchar('\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");
return 0; return 0;
} }
``` ```