加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1、printf字體顯示語法說明
    • 2、舉例
    • 3、給打印信息封裝
    • 4. ?美化程序的打印log
    • 5、完整代碼
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

如何讓你的C程序打印的log多一點色彩?(超級實用)

07/29 11:20
2916
閱讀需 21 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

接著上一篇文章《由字節(jié)對齊引發(fā)的一場“血案“ 》

在平常的調(diào)試中,printf字體格式與顏色都是默認一致的。

如果可以根據(jù)log信息的重要程度,配以不同的顏色與格式,可以很方便的查找到要點。

1、printf字體顯示語法說明

printf(“033[顯示方式;字體顏色;背景顏色m?字符串?033[0m”?);

語法說明:

第一個**33[**表示轉義序列的開始,設置隨后的字體格式轉義序列是以ESC開頭,用33完成相同的工作(ESC 的 ASCII 碼用十進制表示就是27,=用八進制表示的33)。

    顯示方式:0:默認值 ?1:高亮 、22:非粗體、4:下劃線、24:非下劃線、5:閃爍、25:非閃爍、7:反顯、27:非反顯字體顏色30: 黑 ? 31: 紅 32: 綠 33: 黃 34: 藍 35: 紫 36: 深綠 37: 白色背景顏色40: 黑 41: 紅 42: 綠 43: 黃 44: 藍 45: 紫 46: 深綠 47: 白色紅色 ?'m':表示轉義序列的結束結尾處的**33[0m**是恢復默認值。

其他ANSI控制碼:

????/033[0m?關閉所有屬性
????/033[1m?設置高亮度
????/033[4m?下劃線
????/033[5m?閃爍
????/033[7m?反顯
????/033[8m?消隱
????/033[30m?--?/033[37m?設置前景色
????/033[40m?--?/033[47m?設置背景色
????/033[nA?光標上移n行
????/033[nB?光標下移n行
????/033[nC?光標右移n行
????/033[nD?光標左移n行
????/033[y;xH設置光標位置
????/033[2J?清屏
????/033[K?清除從光標到行尾的內(nèi)容
????/033[s?保存光標位置
????/033[u?恢復光標位置
????/033[?25l?隱藏光標
????/033[?25h?顯示光標

注意:
其中 顯示方式;字體顏色;背景顏色 可以任意組合,";"隔開即可。
使用 ANSI 轉義碼來設置文本樣式和顏色可能會因為不同的終端軟件和操作系統(tǒng)而產(chǎn)生不同的效果。
同時,這種方式也只適用于在終端上輸出,如果需要在 GUI 程序中設置文本顏色等效果,則需要使用相應的 GUI 庫提供的接口。

2、舉例

?printf("33[1;31mThis?text?is?in?red?and?bold.33[0mn");
?printf("33[0;31mThis?text?is?in?red?and?not?bold.33[0mn");

其中,'1' 表示加粗或高亮,'31' 表示前景色為紅色,'33[' 是轉義序列的開始,'m' 是轉義序列的結束,'33[0m' 表示將屬性重置為默認值。

運行結果:

方式

?printf("33[0;36m****一口Linux*****【0;36m】33[0mrn");
?printf("33[1;36m****一口Linux*****【1;36m】33[0mrn");
?printf("33[4;36m****一口Linux*****【4;36m】33[0mrn");
?printf("33[5;36m****一口Linux*****【5;36m】33[0mrn");
?printf("33[7;36m****一口Linux*****【7;36m】33[0mrn");
?printf("33[8;36m****一口Linux*****【8;36m】33[0mrn");
?printf("33[22;36m****一口Linux*****【22;36m】33[0mrn");
?printf("33[24;36m****一口Linux*****【24;36m】33[0mrn");
?printf("33[25;36m****一口Linux*****【25;36m】33[0mrn");
?printf("33[27;36m****一口Linux*****【27;36m】33[0mrn");

色譜

測試代碼[僅打印字體顏色]

????printf("33[30m****一口Linux*****【30】33[0mrn");
????printf("33[31m****一口Linux*****【31】33[0mrn");
????printf("33[32m****一口Linux*****【32】33[0mrn");
????printf("33[33m****一口Linux*****【33】33[0mrn");
????printf("33[34m****一口Linux*****【34】33[0mrn");
????printf("33[35m****一口Linux*****【35】33[0mrn");?
????printf("33[36m****一口Linux*****【36】33[0mrn");
????printf("33[37m****一口Linux*****【37】33[0mrn");?

????printf("33[40m****一口Linux*****【40】33[0mrn");
????printf("33[41m****一口Linux*****【41】33[0mrn");
????printf("33[42m****一口Linux*****【42】33[0mrn");
????printf("33[43m****一口Linux*****【43】33[0mrn");
????printf("33[44m****一口Linux*****【44】33[0mrn");
????printf("33[45m****一口Linux*****【45】33[0mrn");?
????printf("33[46m****一口Linux*****【46】33[0mrn");
????printf("33[47m****一口Linux*****【47】33[0mrn");?

3、給打印信息封裝

為方便打印字符串為不同顏色,我們可以將一些常用的顏色定義成宏

#define?HL_TWK_RED_YEL??"33[1m33[5;31;43m"?//閃爍高亮紅字黃底
#define?HL_RED_WRT??????"33[1;31;47m"???//高亮紅色白底

#define?HL_RED??????????"33[1;31m"????//高亮紅色
#define?HL_GRN??????????"33[1;32m"????//高亮綠色
#define?HL_YEL??????????"33[1;33m"????//高亮黃色
#define?HL_DGRN??????????"33[1;36m"????//高亮深綠

#define?PF_CLR??"33[0m"???????//清除?

將系統(tǒng)提供的printf函數(shù)做一個封裝

#define?myprintf(color,?format,?args...)????????
????do{?????????????
????????????printf(color);?????????????
????????????printf(format,?##args);??????????
????????????printf(PF_CLR);?????????????
????}while(0)?

比如我們要打印字符串,顯示為高亮黃色

myprintf(HL_YEL,"%sn","yikoulinux");

4. ?美化程序的打印log

假設我們有如下格式的通信信令:

調(diào)試通信協(xié)議

我們經(jīng)常需要將通信的信令以16進制格式全部打印出來,

這些數(shù)據(jù)看起來非常不直觀,

為方便查看log,將幾個最重要字段顯示出來,

比如msgType、len

??
void?dump_frm(char?*title,UINT8?*data,int?len)
{
?int?i=0;
??
?myprintf(HL_YEL,"%sn",title);
?for(i=0;i<len;i++)
?{
??if(i==0){
???myprintf(HL_RED,"%02x?",data[i]);??
??}else?if(i==3?||?i==4){
???myprintf(HL_DGRN,"%02x?",data[i]);??
??}
??else{???
???myprintf(HL_GRN,"%02x?",data[i]);?
??}??
?}
?putchar('n');?
}?

將我們的測試針數(shù)據(jù),放進去測試一下

?UCHAR?frm[]={0x12,0x34,0x56,0x00,0x07,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
?
dump_frm("frm<<<",frm,sizeof(frm));

執(zhí)行結果:

可以看到,這種幀格式,看起來會更加直觀,

5、完整代碼

國際慣例,貼上完整代碼,

需要的老鐵,直接拷貝帶你們的項目里吧

?#include?<stdio.h>
#include?<string.h>

typedef?unsigned?char?UCHAR;
typedef?unsigned?char?UINT8;
typedef?unsigned?short?UINT16;
#pragma?pack(1)
typedef?struct?protocol_msg_align{
?UINT8?msgType;
?UINT8?data1;
?UINT8?data2;
?UINT16?len;
?char?data[100];
}PRO_MSG_ALIGN;
#pragma

#define?HL_TWK_RED_YEL??"33[1m33[5;31;43m"?//閃爍高亮紅字黃底
#define?HL_RED_WRT??????"33[1;31;47m"???//高亮紅色白底

#define?HL_RED??????????"33[1;31m"????//高亮紅色
#define?HL_GRN??????????"33[1;32m"????//高亮綠色
#define?HL_YEL??????????"33[1;33m"????//高亮黃色
#define?HL_DGRN??????????"33[1;36m"????//高亮深綠

#define?PF_CLR??"33[0m"???????//清除?

?
#define?myprintf(color,?format,?args...)????????
????do{?????????????
????????????printf(color);?????????????
????????????printf(format,?##args);??????????
????????????printf(PF_CLR);?????????????
????}while(0)?
??
void?dump_frm(char?*title,UINT8?*data,int?len)
{
?int?i=0;
??
?myprintf(HL_YEL,"%sn",title);
?for(i=0;i<len;i++)
?{
??if(i==0){
???myprintf(HL_RED,"%02x?",data[i]);??
??}else?if(i==3?||?i==4){
???myprintf(HL_DGRN,"%02x?",data[i]);??
??}
??else{???
???myprintf(HL_GRN,"%02x?",data[i]);?
??}??
?}
?putchar('n');?
}?

int?main(int?args,?char?*argv[])
{
?UCHAR?frm[]={0x12,0x34,0x56,0x00,0x07,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
?dump_frm("frm<<<",frm,sizeof(frm));
#if?0?
?printf("33[1;31mThis?text?is?in?red?and?bold.33[0mn");
?printf("33[0;31mThis?text?is?in?red?and?not?bold.33[0mn");

?
?printf("33[0;36m****一口Linux*****【0;36m】33[0mrn");
?printf("33[1;36m****一口Linux*****【1;36m】33[0mrn");
?printf("33[4;36m****一口Linux*****【4;36m】33[0mrn");
?printf("33[5;36m****一口Linux*****【5;36m】33[0mrn");
?printf("33[7;36m****一口Linux*****【7;36m】33[0mrn");
?printf("33[8;36m****一口Linux*****【8;36m】33[0mrn");
?printf("33[22;36m****一口Linux*****【22;36m】33[0mrn");
?printf("33[24;36m****一口Linux*****【24;36m】33[0mrn");
?printf("33[25;36m****一口Linux*****【25;36m】33[0mrn");
?printf("33[27;36m****一口Linux*****【27;36m】33[0mrn");
?
????printf("33[30m****一口Linux*****【30】33[0mrn");
????printf("33[31m****一口Linux*****【31】33[0mrn");
????printf("33[32m****一口Linux*****【32】33[0mrn");
????printf("33[33m****一口Linux*****【33】33[0mrn");
????printf("33[34m****一口Linux*****【34】33[0mrn");
????printf("33[35m****一口Linux*****【35】33[0mrn");?
????printf("33[36m****一口Linux*****【36】33[0mrn");
????printf("33[37m****一口Linux*****【37】33[0mrn");?

????printf("33[40m****一口Linux*****【40】33[0mrn");
????printf("33[41m****一口Linux*****【41】33[0mrn");
????printf("33[42m****一口Linux*****【42】33[0mrn");
????printf("33[43m****一口Linux*****【43】33[0mrn");
????printf("33[44m****一口Linux*****【44】33[0mrn");
????printf("33[45m****一口Linux*****【45】33[0mrn");?
????printf("33[46m****一口Linux*****【46】33[0mrn");
????printf("33[47m****一口Linux*****【47】33[0mrn");?
?
?#endif
????return?0;
}

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
LTC6905HS5-100#TRMPBF 1 Linear Technology LTC6905-XXX - Fixed Frequency SOT-23 Oscillator; Package: SOT; Pins: 5; Temperature Range: -40&deg;C to 125&deg;C
$41.05 查看
HFBR-1412TZ 1 Broadcom Limited Transmitter, 792nm Min, 865nm Max, 5Mbps, ST Connector, DIP, Panel Mount, Through Hole Mount, ROHS COMPLIANT PACKAGE

ECAD模型

下載ECAD模型
$27.55 查看
OPI1264C 1 Bedford Opto Technology Ltd Optoelectronic Device
$3.48 查看

相關推薦

電子產(chǎn)業(yè)圖譜

公眾號『一口Linux』號主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗和培訓經(jīng)驗。曾任職ZTE,某研究所,華清遠見教學總監(jiān)。擁有多篇網(wǎng)絡協(xié)議相關專利和軟件著作。精通計算機網(wǎng)絡、Linux系統(tǒng)編程、ARM、Linux驅(qū)動、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實際項目出發(fā),保持原理+實踐風格,適合Linux驅(qū)動新手入門和技術進階。