之前在写shell脚本的时候,尝试了改变终端程序中输出的字的颜色,大致格式如下:
echo "\033[字背景颜色;字体颜色m字符串\033[0m"
例如:
echo "\033[41;36m something here \033[0m"
其中41的位置代表底色, 36的位置是代表字的颜色。
今天发现C/C++程序中改变终端程序输出的字的颜色的方法和Shell脚本中的基本类似,现在来总结一下。
在C中只需要用printf
函数代替上边的echo -e
就OK了。参见下例:
#include
int main()
{
printf("\033[31mThis is RED.\n\033[0m");
return 0;
}
31m代表字体为红色,0m代表关闭所有属性。
简单的说就是ESC[*m,ESC的八进制为\033,*可以是多个属性的组合,用分号隔开。
常用的ANSI控制码如下(有些不支持):
\033[0m 关闭所有属性
\033[1m 高亮
\033[2m 亮度减半
\033[3m 斜体
\033[4m 下划线
\033[5m 闪烁
\033[6m 快闪
\033[7m 反显
\033[8m 消隐
\033[9m 中间一道横线
10-19 关于字体的
21-29 基本与1-9正好相反
30-37 设置前景色
40-47 设置背景色
# 字颜色:30--37
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
38 打开下划线,设置默认前景色
39 关闭下划线,设置默认前景色
# 字背景颜色范围:40--49
40 黑色背景
41 红色背景
42 绿色背景
43 棕色背景
44 蓝色背景
45 品红背景
46 孔雀蓝背景
47 白色背景
48 不知道什么东西
49 设置默认背景色
50-89 没用
90-109 又是设置前景背景的,比之前的颜色浅
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
建议
可以在程序头部定义一些宏变量,这样程序看起来更简洁。
如:发生错误的时候,错误信息显示红色;发送警告的时候,警告信息显示黄色。
#define WARN_MSG_V(msg, ...) \
printf("\033[33m" msg "\n\033[0m", ##__VA_ARGS__)
#define ERR_MSG_V(msg, ...) \
printf("\033[31m" msg "\n\033[0m", ##__VA_ARGS__)
当然,也可以加上这些错误/警告发送在哪个函数,哪一行:
#define ERR_MSG_V(msg, ...) \
printf("** ERROR: <%s:%d>: " msg "\n", __func__, __LINE__, ##__VA_ARGS__)
#define INFO_MSG_V(msg, ...) \
printf("** INFO: <%s:%d>: " msg "\n", __func__, __LINE__, ##__VA_ARGS__)
#define WARN_MSG_V(msg, ...) \
printf("** WARN: <%s:%d>: " msg "\n", __func__, __LINE__, ##__VA_ARGS__)