在终端上输出的字体总是单色,但在一些场景彩色输出更能满足需求,在Linux环境中,可以使用终端控制字符来设置输出字符的颜色,在部分版本的Windows系统中也可以使用。本文参考一些文献简要介绍一下在Windows下彩色输出的方法。
1. ANSI 转义序列
在终端上不仅能够显示程序的输出,还可以以不同的配色方案输出。在实际应用中,常常使用两种配色方案:一是16 色(8背景+8前景),而是255 色。
16色的配色方案包含两个颜色设置,每个8色,一个是背景色,一个是字体色(也即前景色),这个配色方案的语法格式如图1所示[1]。
图1 16色配色方案语法格式
例如:\033[1;32;40m
此处的 \033[ 是转义字符,1代表高亮,32代表前景色为绿色,背景色为黑色。
256色的配色方案的语法格式如图2所示,具体用法参看文献1。
图2 256色配色方案语法格式
2. 16色配色方案介绍
(1)在终端输出彩色文字的语法
用图1的格式设置彩色输出,然后输出文字,最后可以设置彩色格式输出结束,使用的控制字符为:\033[0m。以下图片均来自文献2。
(2)在终端输出彩色文字解决方案
适用于Windows 10的解决方案是在输出文字前执行system("")函数,执行后允许在本机的命令提示符和Powershell中输出彩色文字。
3. 实例
输出一个心图案,然后在图案中间用不同颜色输出C程序设计与训练文字。
文献3介绍了如何保存光标位置和恢复光标位置的控制码。
ESC 7:保存光标位置在存储器中
ESC 8:从存储器中恢复光标位置
ESC [ <n> A:光标向上移动行数
ESC [ <n> C:光标向右移动位置
源程序如下:
#include <stdio.h>
#include <windows.h>
int main()
{
system(""); // 设置终端可以显示彩色文本
printf("\033[1;31m"); // 高亮红字
for(double y=1.5; y>-1.5; y-=0.1){
for(double x=-1.5; x<1.5; x+=0.05) {
double a = x*x+y*y-1;
putchar(a*a*a-x*x*y*y*y <= 0.0f? '+' : ' ');
}
putchar('\n');
}
printf("\033[0;41m"); // 默认,背景红色
printf("\0337\033[19A\033[23C"); // 设置光标位置:向上移动19行,向右移动23个位置
printf(" C程序设计与训练 ");
printf("\0338"); // 恢复光标位置
printf("\033[0m"); // 彩色文本输出结束
return 0;
}
运行效果图。
参考文献
[1]https://blog.csdn.net/star6112/article/details/129714869
[2]https://blog.csdn.net/weixin_69553582/article/details/125700943
[3]https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences