带颜色的printf

  • 作者:Moilk
  • 最后编辑:2016年05月21日
  • 标签: Linux

  最近要写一个功能类似于Linux下“ls -lR”命令的小程序,熟悉Linux的朋友应该知道,这个命令的功能就是显示指令目录下文件及子目录的信息,会递归地把子目录下面的文件等信息显示出来。当然,它的功能对本篇文章的主题来说无关紧要。我们知道,为了方便观察(看上去酷炫),ls命令的结果中对特定属性的文件会有特别的颜色进行显示,如下图:
linuc00
  现在就开始切入主题了,要是我们自己写的程序也能够在命令行下边有丰富的颜色输出该多好啊。是的,在Linux中printf函数已经实现了这个功能。
  在printf的字符串常量中,添加一定格式的字符串,printf函数就能够自动识别然后改变后面的文字在命令行中的显示。具体格式如下所示:

\033[特效;前景色;背景色m

其中,特效的取值如下表所示:

特效
0 无特效
1 高亮
4 下划线
5 闪烁
7 反显
8 消隐

前景色的取值如下表所示:

高亮 非高亮
30 黑色 黑色
31 红色 红色
32 绿色 绿色
33 黄色 黄色
34 蓝色 蓝色
35 洋红 洋红
36 青色 青色
37 白色 白色

背景色取值只是将十位数改为4,如下表所示:

高亮 非高亮
40 黑色 黑色
41 红色 红色
42 绿色 绿色
43 黄色 黄色
44 蓝色 蓝色
45 洋红 洋红
46 青色 青色
47 白色 白色

  比如说,执行下面的程序:

#include <stdio.h>

int main(void) {
	printf("\033[1;34;40mhello \033[0;32;40mworld\033[5;33;45m!\033[0m\n");
	printf("\033[4;36;43mhello\033[0m \033[3;31;45mmoilk\033[4;35;40m!\033[0m\n");

	return 0;
}

  可得到结果如下图所示:
linuc00

还需要注意的是,字符串末尾最好加上“\033[0m”,让颜色恢复默认值。否则不止printf的输出,后面的命令行文字都会变色