之前在寫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__)