下面我将详细解释如何使用它,并提供代码示例。
核心原理:ANSI 转义码
终端通过识别特殊的字符串序列来改变后续文本的样式,比如颜色、背景色、加粗等,这些序列以 \033[ 开头(也可以写作 \e[ 或 \x1b[),以 m
- 格式:
\033[<code>m
- 作用: 这个序列会改变终端的显示状态,直到遇到下一个
\033[0m(重置所有样式)为止。
基本使用方法
要在 printf 中使用颜色,你只需要将对应的 ANSI 转义码字符串嵌入到你的格式字符串中即可。
重置码 (非常重要!)
在改变颜色后,最好在输出结束时使用 重置码 \033[0m,将终端的样式恢复到默认状态,否则后续的所有文本都会带有你设置的样式。
\033[0m 是重置所有样式的通用代码。
常用颜色代码
前景色(文本颜色)
| 代码 |
颜色 |
英文名 |
\033[30m |
黑色 |
Black |
\033[31m |
红色 |
Red |
\033[32m |
绿色 |
Green |
\033[33m |
黄色 |
Yellow |
\033[34m |
蓝色 |
Blue |
\033[35m |
洋红 |
Magenta |
\033[36m |
青色 |
Cyan |
\033[37m |
白色 |
White |
背景色
| 代码 |
颜色 |
英文名 |
\033[40m |
黑色 |
Black |
\033[41m |
红色 |
Red |
\033[42m |
绿色 |
Green |
\033[43m |
黄色 |
Yellow |
\033[44m |
蓝色 |
Blue |
\033[45m |
洋红 |
Magenta |
\033[46m |
青色 |
Cyan |
\033[47m |
白色 |
White |
其他样式
| 代码 |
样式 |
英文名 |
\033[1m |
加粗 |
Bold |
\033[4m |
下划线 |
Underline |
\033[0m |
重置 |
Reset |
C 语言代码示例
下面是一个完整的 C 语言示例,展示了如何打印不同颜色和样式的文本。
#include <stdio.h>
int main() {
// 打印红色文本
printf("\033[31mThis is red text.\033[0m\n");
// 打印绿色背景的白色文本
printf("\033[47m\033[32mThis is green text on a white background.\033[0m\n");
// 打印加粗的黄色文本
printf("\033[1m\033[33mThis is bold yellow text.\033[0m\n");
// 打印带下划线的蓝色文本
printf("\033[4m\033[34mThis is underlined blue text.\033[0m\n");
// 组合使用:红色加粗文本
printf("\033[31m\033[1mThis is bold red text.\033[0m\n");
// 一个更清晰的例子:打印彩色标题
printf("\033[1;32m"); // 设置为加粗和绿色
printf("--- My Program Output ---\n");
printf("\033[0m"); // 重置
printf("This is a normal line.\n");
printf("\033[31m[ERROR] This is an error message.\033[0m\n");
printf("\033[32m[SUCCESS] This is a success message.\033[0m\n");
return 0;
}
如何编译和运行?
- 将上述代码保存为
color.c。
- 使用 GCC 编译:
gcc color.c -o color
- 运行程序:
./color
预期输出效果:
你的终端会显示如下内容(不同终端的颜色可能略有差异):
重要注意事项和跨平台问题
-
不是所有终端都支持
这种方法在绝大多数现代终端中都是有效的,
- Linux 终端 (GNOME Terminal, Konsole, XFCE Terminal 等)
- macOS 的 Terminal.app 和 iTerm2
- Windows 10/11 的 Windows Terminal 和新版命令提示符
在旧版的 Windows 命令提示符 中,ANSI 转义码默认是不被支持的,如果你在这些环境中运行,会看到一堆奇怪的字符 \033[31m。
-
Windows 10/11 的解决方案
对于 Windows 10/11,你可以通过一个简单的 API 调用来启用 ANSI 支持,在你的 C 程序开头加上以下代码即可:
#include <windows.h>
// 在 main 函数的最开始调用
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdOut, &mode);
SetConsoleMode(hStdOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
加上这段代码后,你的 ANSI 颜色代码就能在 Windows Terminal 和新版 CMD 中正常工作了。
-
可读性差
直接在 printf 字符串中写 \033[31m 会降低代码的可读性,一个更好的做法是使用宏定义:
#include <stdio.h>
// 定义颜色宏
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define MAGENTA "\033[35m"
#define CYAN "\033[36m"
#define WHITE "\033[37m"
#define RESET "\033[0m"
int main() {
printf(RED "This is red text.\n" RESET);
printf(GREEN "This is green text.\n" RESET);
printf(YELLOW "This is yellow text.\n" RESET);
printf(BLUE "This is blue text.\n" RESET);
printf(MAGENTA "This is magenta text.\n" RESET);
printf(CYAN "This is cyan text.\n" RESET);
printf(WHITE "This is white text.\n" RESET);
return 0;
}
使用宏定义后,代码清晰明了,易于维护和扩展。
- 原理: 使用 ANSI 转义码
\033[<code>m 来控制终端样式。
- 关键: 记得使用
\033[0m 来重置样式。
- 优点: 简单、通用,适用于绝大多数现代终端。
- 缺点: 在旧版 Windows CMD 中不工作(可通过 API 解决)。
- 最佳实践: 使用宏定义来提高代码可读性。
对于更复杂的跨平台终端控制,可以考虑使用专门的库,如 ncurses,但就简单的颜色输出而言,ANSI 转义码已经足够强大和方便。