std::cout打印不同颜色的字符到终端
在 C++ 中,std::cout 打印到终端时可以利用 ANSI 转义序列 来改变字符颜色。只要终端支持 ANSI escape codes,就可以在输出中嵌入这些特殊的转义序列来设置前景色、背景色以及其他样式,比如加粗、下划线等。
基本原理
ANSI 转义序列形如:
\033[<style>;<foreground>;<background>m
\033是转义字符(Esc)。[ ... m内是样式代码。- 结束时用
\033[0m来重置颜色。
常用颜色代码
前景色:
| 颜色 | 代码 |
|---|---|
| 黑色 | 30 |
| 红色 | 31 |
| 绿色 | 32 |
| 黄色 | 33 |
| 蓝色 | 34 |
| 品红(洋红) | 35 |
| 青色 | 36 |
| 白色 | 37 |
背景色:
| 颜色 | 代码 |
|---|---|
| 黑色 | 40 |
| 红色 | 41 |
| 绿色 | 42 |
| 黄色 | 43 |
| 蓝色 | 44 |
| 品红(洋红) | 45 |
| 青色 | 46 |
| 白色 | 47 |
示例代码
#include <iostream>int main() {// 红色文字std::cout << "\033[31mRed Text\033[0m\n";// 绿色背景 + 白色文字std::cout << "\033[37;42mWhite on Green\033[0m\n";// 多段彩色输出std::cout << "\033[31mR\033[32mG\033[34mB\033[0m\n";// 加粗蓝色文字std::cout << "\033[1;34mBold Blue\033[0m\n";return 0;
}
注意:
\033[0m必须在最后打印,用于重置终端颜色,否则后续输出会继承之前的颜色。- 在 Windows 的 cmd 早期版本可能不支持 ANSI,需要使用 Windows 10+ 或启用 ANSI 支持;或者用 WinAPI(
SetConsoleTextAttribute)控制颜色。- 在 Linux/macOS 终端一般默认支持 ANSI 转义序列。
扩展:使用库封装
如果不想手写转义序列,可以用库,比如:
fmt/spdlog支持颜色输出。termcolor:一个轻量 C++ header-only 库。rang:简单易用,不需要额外依赖。
例如 termcolor:
#include <iostream>
#include <termcolor/termcolor.hpp>int main() {std::cout << termcolor::red << "Hello Red" << termcolor::reset << std::endl;std::cout << termcolor::green << "Hello Green" << termcolor::reset << std::endl;
}
