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

3.5 KiB
Raw Blame History

作者:粤嵌-李林峰

终端显示字体和颜色的方法

在终端中使用printf输出时可以通过ANSI转义码来控制文本的颜色、背景色和字体样式。下面详细介绍各种控制方法。

基本格式

ANSI转义码的基本格式为

printf("\033[属性值;...;属性值 m 文本内容 \033[0m");

其中:

  • \033 是ESC字符的八进制表示也可以用\x1b十六进制表示

  • [ 开始控制序列

  • 属性值 是控制代码,多个属性用分号分隔

  • m 结束控制序列

  • \033[0m 重置所有属性

字体样式控制

代码 效果
0 重置所有属性
1 加粗/高亮
2 暗淡/弱化
3 斜体
4 下划线
5 闪烁
7 反显(反色)
8 隐藏
9 删除线

示例:

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 亮白

示例:

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 亮白

示例:

printf("\033[41m红色背景\033[0m\n");
printf("\033[104m亮蓝色背景\033[0m\n");

组合使用

可以同时设置多个属性,用分号分隔:

printf("\033[1;31;42m加粗红色文字绿色背景\033[0m\n");
printf("\033[4;93;44m下划线亮黄色文字蓝色背景\033[0m\n");

256色模式

对于支持256色的终端可以使用更丰富的颜色

前景色:

printf("\033[38;5;颜色编号m文本\033[0m");

背景色:

printf("\033[48;5;颜色编号m文本\033[0m");

颜色编号范围0-255其中

  • 0-15标准16色

  • 16-2316×6×6 RGB立方

  • 232-255灰度

示例:

printf("\033[38;5;196m红色文字\033[0m\n");
printf("\033[48;5;226m黄色背景\033[0m\n");

RGB真彩色模式

最新终端支持RGB真彩色

前景色:

printf("\033[38;2;R;G;Bm文本\033[0m");

背景色:

printf("\033[48;2;R;G;Bm文本\033[0m");

其中R,G,B为0-255的数值。

示例:

printf("\033[38;2;255;100;100m自定义颜色文字\033[0m\n");
printf("\033[48;2;100;200;255m自定义背景色\033[0m\n");

注意事项

  1. 不是所有终端都支持所有颜色和效果

  2. 使用后记得用\033[0m重置属性

  3. 某些效果(如闪烁)可能被终端禁用

  4. Windows CMD默认不支持需要启用ANSI支持或使用其他终端

实用技巧

可以定义宏简化使用:

#define RED   "\033[31m"
#define GREEN "\033[32m"
#define RESET "\033[0m"

printf(RED "错误: " RESET "发生错误\n");

或者定义函数:

void print_color(const char* color, const char* text) 
{
    printf("%s%s" RESET, color, text);
}

print_color("\033[1;34m", "重要信息");

参考文件:

terminal_colors.h