printf实现彩色输出, ANSI 转义序列详解

在这里插入图片描述

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 实现丰富多彩的终端输出。

猜你喜欢

转载自blog.csdn.net/suifengme/article/details/142234028