ANSI 转义序列是一种在终端中改变文本颜色和其他属性的方法。基本格式为 \e[<code>m
,其中 <code>
是一系列数字,用于表示不同的颜色和属性。
基本格式
\e[<code>m
这里的 <code>
可以是单个或多个数字,用分号 ;
分隔。例如,1;31
表示加粗红色文本。
ANSI 颜色代码
前景色
代码 | 描述 |
---|---|
30 |
黑色 |
31 |
红色 |
32 |
绿色 |
33 |
黄色 |
34 |
蓝色 |
35 |
紫色(品红) |
36 |
青色 |
37 |
白色 |
39 |
默认颜色 |
背景色
代码 | 描述 |
---|---|
40 |
黑色背景 |
41 |
红色背景 |
42 |
绿色背景 |
43 |
黄色背景 |
44 |
蓝色背景 |
45 |
紫色(品红)背景 |
46 |
青色背景 |
47 |
白色背景 |
49 |
默认背景颜色 |
样式代码
代码 | 描述 |
---|---|
0 |
重置所有属性 |
1 |
加粗(亮色) |
2 |
淡色 |
3 |
斜体(部分终端不支持) |
4 |
下划线 |
5 |
闪烁 |
7 |
反色(反转前景和背景) |
8 |
隐藏 |
示例代码
下面是一些使用 ANSI 转义序列实现彩色输出的示例代码:
示例 1:简单彩色输出
#include <stdio.h>
int main() {
printf("\e[31mRed Text\e[0m\n"); // 红色文本
printf("\e[32mGreen Text\e[0m\n"); // 绿色文本
printf("\e[33mYellow Text\e[0m\n"); // 黄色文本
return 0;
}
示例 2:复合样式输出
#include <stdio.h>
int main() {
printf("\e[1;31mBold Red Text\e[0m\n"); // 加粗红色文本
printf("\e[4;32mUnderlined Green Text\e[0m\n"); // 下划线绿色文本
printf("\e[7;33mReversed Yellow Text\e[0m\n"); // 反色黄色文本
return 0;
}
示例 3:背景颜色输出
#include <stdio.h>
int main() {
printf("\e[41mRed Background\e[0m\n"); // 红色背景
printf("\e[42mGreen Background\e[0m\n"); // 绿色背景
printf("\e[43mYellow Background\e[0m\n"); // 黄色背景
return 0;
}
示例 4:组合颜色和样式
#include <stdio.h>
int main() {
printf("\e[1;31;42mBold Red Text on Green Background\e[0m\n"); // 加粗红色文本在绿色背景上
return 0;
}
高亮和淡色
除了基本的颜色代码外,还可以使用高亮(明亮)和淡色(浅色)版本的颜色:
高亮(明亮)前景色
代码 | 描述 |
---|---|
90 |
淡灰色 |
91 |
亮红色 |
92 |
亮绿色 |
93 |
亮黄色 |
94 |
亮蓝色 |
95 |
亮紫色(品红) |
96 |
亮青色 |
97 |
亮白色 |
高亮(明亮)背景色
代码 | 描述 |
---|---|
100 |
淡灰色背景 |
101 |
亮红色背景 |
102 |
亮绿色背景 |
103 |
亮黄色背景 |
104 |
亮蓝色背景 |
105 |
亮紫色(品红)背景 |
106 |
亮青色背景 |
107 |
亮白色背景 |
示例 5:高亮颜色输出
#include <stdio.h>
int main() {
printf("\e[91mBright Red Text\e[0m\n"); // 亮红色文本
printf("\e[92mBright Green Text\e[0m\n"); // 亮绿色文本
printf("\e[93mBright Yellow Text\e[0m\n"); // 亮黄色文本
return 0;
}
示例 6:高亮背景颜色输出
#include <stdio.h>
int main() {
printf("\e[101mBright Red Background\e[0m\n"); // 亮红色背景
printf("\e[102mBright Green Background\e[0m\n"); // 亮绿色背景
printf("\e[103mBright Yellow Background\e[0m\n"); // 亮黄色背景
return 0;
}
示例 7:组合高亮颜色和样式
#include <stdio.h>
int main() {
printf("\e[1;91;102mBold Bright Red Text on Bright Green Background\e[0m\n"); // 加粗亮红色文本在亮绿色背景上
return 0;
}
注意事项
- 兼容性:不同的终端支持的 ANSI 转义序列可能会有所不同,有些终端可能不支持某些样式或颜色。
- 重置所有属性:在使用 ANSI 转义序列后,最好添加
\e[0m
来重置所有属性,确保后续的文本不受影响。 - Windows 支持:在 Windows 系统中,默认的命令行工具(如 cmd.exe)对 ANSI 转义序列的支持有限。可以使用 PowerShell 或启用虚拟终端处理的 cmd.exe(通过
ENABLE_VIRTUAL_TERMINAL_PROCESSING
选项)来支持 ANSI 转义序列。
示例:Windows 上启用 ANSI 支持
在 Windows 10 中,可以通过以下代码启用对 ANSI 转义序列的支持:
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD consoleMode;
GetConsoleMode(hConsole, &consoleMode);
consoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(hConsole, consoleMode);
printf("\e[31mRed Text\e[0m\n");
printf("\e[32mGreen Text\e[0m\n");
printf("\e[33mYellow Text\e[0m\n");
return 0;
}
通过这些示例和解释,你应该能够更好地理解和应用 ANSI 转义序列来实现彩色输出。希望这能帮助你在实际项目中使用 printf
实现丰富多彩的终端输出。