Files
BlogPosts/Collection/YoudaoyunNotes/02C语言/[01-拓展]printf输出颜色与字体控制.md

208 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

作者:粤嵌-李林峰
# 终端显示字体和颜色的方法
在终端中使用printf输出时可以通过ANSI转义码来控制文本的颜色、背景色和字体样式。下面详细介绍各种控制方法。
## 基本格式
ANSI转义码的基本格式为
```c
printf("\033[属性值;...;属性值 m 文本内容 \033[0m");
```
其中:
- \033 是ESC字符的八进制表示也可以用\x1b十六进制表示
- [ 开始控制序列
- 属性值 是控制代码,多个属性用分号分隔
- m 结束控制序列
- \033[0m 重置所有属性
## 字体样式控制
| 代码 | 效果 |
| -- | -- |
| 0 | 重置所有属性 |
| 1 | 加粗/高亮 |
| 2 | 暗淡/弱化 |
| 3 | 斜体 |
| 4 | 下划线 |
| 5 | 闪烁 |
| 7 | 反显(反色) |
| 8 | 隐藏 |
| 9 | 删除线 |
示例:
```c
printf("\033[1m加粗文本\033[0m\n");
printf("\033[3m斜体文本\033[0m\n");
printf("\033[4m下划线文本\033[0m\n");
```
## 前景色(文字颜色)
| 代码 | 颜色 |
| -- | -- |
| 30 | 黑色 |
| 31 | 红色 |
| 32 | 绿色 |
| 33 | 黄色 |
| 34 | 蓝色 |
| 35 | 洋红 |
| 36 | 青色 |
| 37 | 白色 |
| 90 | 亮黑 |
| 91 | 亮红 |
| 92 | 亮绿 |
| 93 | 亮黄 |
| 94 | 亮蓝 |
| 95 | 亮洋红 |
| 96 | 亮青 |
| 97 | 亮白 |
示例:
```c
printf("\033[31m红色文字\033[0m\n");
printf("\033[92m亮绿色文字\033[0m\n");
```
## 背景色
| 代码 | 颜色 |
| -- | -- |
| 40 | 黑色 |
| 41 | 红色 |
| 42 | 绿色 |
| 43 | 黄色 |
| 44 | 蓝色 |
| 45 | 洋红 |
| 46 | 青色 |
| 47 | 白色 |
| 100 | 亮黑 |
| 101 | 亮红 |
| 102 | 亮绿 |
| 103 | 亮黄 |
| 104 | 亮蓝 |
| 105 | 亮洋红 |
| 106 | 亮青 |
| 107 | 亮白 |
示例:
```c
printf("\033[41m红色背景\033[0m\n");
printf("\033[104m亮蓝色背景\033[0m\n");
```
## 组合使用
可以同时设置多个属性,用分号分隔:
```c
printf("\033[1;31;42m加粗红色文字绿色背景\033[0m\n");
printf("\033[4;93;44m下划线亮黄色文字蓝色背景\033[0m\n");
```
## 256色模式
对于支持256色的终端可以使用更丰富的颜色
前景色:
```c
printf("\033[38;5;颜色编号m文本\033[0m");
```
背景色:
```c
printf("\033[48;5;颜色编号m文本\033[0m");
```
颜色编号范围0-255其中
- 0-15标准16色
- 16-2316×6×6 RGB立方
- 232-255灰度
示例:
```c
printf("\033[38;5;196m红色文字\033[0m\n");
printf("\033[48;5;226m黄色背景\033[0m\n");
```
## RGB真彩色模式
最新终端支持RGB真彩色
前景色:
```c
printf("\033[38;2;R;G;Bm文本\033[0m");
```
背景色:
```c
printf("\033[48;2;R;G;Bm文本\033[0m");
```
其中R,G,B为0-255的数值。
示例:
```c
printf("\033[38;2;255;100;100m自定义颜色文字\033[0m\n");
printf("\033[48;2;100;200;255m自定义背景色\033[0m\n");
```
## 注意事项
1. 不是所有终端都支持所有颜色和效果
1. 使用后记得用\033[0m重置属性
1. 某些效果(如闪烁)可能被终端禁用
1. Windows CMD默认不支持需要启用ANSI支持或使用其他终端
## 实用技巧
可以定义宏简化使用:
```c
#define RED "\033[31m"
#define GREEN "\033[32m"
#define RESET "\033[0m"
printf(RED "错误: " RESET "发生错误\n");
```
或者定义函数:
```c
void print_color(const char* color, const char* text)
{
printf("%s%s" RESET, color, text);
}
print_color("\033[1;34m", "重要信息");
```
参考文件:
[terminal_colors.h](attachments/WEBRESOURCEf8f411dd54c53da227a89fc7031bb0c7terminal_colors.h)