在ANSI終端下可以顯示彩色代碼:
如 printgf(“33[01;40;32m HELLO 33[01;40;37m”); 能顯示綠色的HELLO字樣。
printf("\033[0;32mPASSED\033[0;0m\n");
printf("\033[0;31mFAILED\033[0;0m\n");
這里33[是轉義子列,表示后面接的是顏色代碼。
01是高亮度,不寫是低亮度。
40是背景色,40:黑,41:紅:42:綠,43:黃,44:青,45:藍,47:白。
32m是前景色:30:黑,31:紅,32:綠,33:黃,34:藍,35:紫,36:青,37:白。
實例:printf("\033[1;33m Hello World. \033[0m \n");
\033 [1; 33m xxxx
| | | |
開始 背景色 字體色 字符串
一,printf打印出不同顏色
printf("\033[字背景顏色;字體顏色m字符串\033[0m" );
顏色代碼:
QUOTE:
字背景顏色范圍: 40--49 字顏色: 30--39
40: 黑 30: 黑
41: 紅 31: 紅
42: 綠 32: 綠
43: 黃 33: 黃
44: 藍 34: 藍
45: 紫 35: 紫
46: 深綠 36: 深綠
47: 白色 37: 白色
ANSI控制碼:
QUOTE:
\033[0m 關閉所有屬性
\033[1m 設置高亮度
\03[4m 下划線
\033[5m 閃爍
\033[7m 反顯
\033[8m 消隱
\033[30m -- \033[37m 設置前景色
\033[40m -- \033[47m 設置背景色
\033[nA 光標上移n行
\03[nB 光標下移n行
\033[nC 光標右移n行
\033[nD 光標左移n行
\033[y;xH設置光標位置
\033[2J 清屏
\033[K 清除從光標到行尾的內容
\033[s 保存光標位置
\033[u 恢復光標位置
\033[?25l 隱藏光標
\33[?25h 顯示光標
// ----------------------------------------------------------------------------------
# include <stdio.h>
# include <string.h>
# include <time.h>
# include <stdlib.h>
// ----------------------------------------------------------------------------------
// 01是高亮度,不寫是低亮度。
// 40是背景色,40:黑,41:紅:42:綠,43:黃,44:青,45:藍,47:白。
// 32m是前景色:30:黑,31:紅,32:綠,33:黃,34:藍,35:紫,36:青,37:白。
// ----------------------------------------------------------------------------------
// printf
# define system_printf "printf " // printf
// head
# define properties_head "\"\\033[" // 數據頭
// 添加分號
# define Control_code_add_semicolon ";" // 拼接
// 添加尾
# define Control_code_con_end "m" // 拼接
// 尾
# define Control_code_terminal_end "\n\"" // 尾部
# define Control_code_terminal_file "\n\">>output.txt" // 尾部
// Control code
# define Control_code_Close_all_properties 0 // 清空all屬性
# define Control_code_brightness_High 1 // 設置高亮度
# define Control_code_Italic 3 // 設置斜體
# define Control_code_Underscore 4 // 設置下划線
# define Control_code_Flashing 5 // 設置閃爍
# define Control_code_Reverse 7 // 設置返現
# define Control_code_Blanking 8 // 設置消隱
# define Control_code_Strikethrough_text 9 // 設置文本刪除線
# define Control_code_Double_underscore 21 // 設置雙下划線
// 字體顏色設置
# define Control_code_Font_color_black 30 // 設置字體顏色黑色
# define Control_code_Font_color_red 31 // 設置字體顏色紅色
# define Control_code_Font_color_green 32 // 設置字體顏色綠色
# define Control_code_Font_color_yellow 33 // 設置字體顏色黃色
# define Control_code_Font_color_blue 34 // 設置字體顏色藍色
# define Control_code_Font_color_purple 35 // 設置字體顏色紫色
# define Control_code_Font_color_Dark_green 36 // 設置字體顏色深綠
# define Control_code_Font_color_gray 37 // 設置字體顏色灰白
// 背景顏色設置
# define Control_code_background_color_black 40 // 設置背景顏色黑色
# define Control_code_background_color_red 41 // 設置背景顏色紅色
# define Control_code_background_color_green 42 // 設置背景顏色綠色
# define Control_code_background_color_yellow 43 // 設置背景顏色黃色
# define Control_code_background_color_blue 44 // 設置背景顏色藍色
# define Control_code_background_color_purple 45 // 設置背景顏色紫色
# define Control_code_background_color_Dark_green 46 // 設置背景顏色深綠
# define Control_code_background_color_gray 47 // 設置背景顏色灰白
// ----------------------------------------------------------------------------------
# define par_type long
// ----------------------------------------------------------------------------------
// 流程
# define lcd_code_log_options_Hardware_data 0x0001 // lcd硬件數據
# define lcd_code_log_options_Initialization_data 0x0002 // 數據初始化
# define lcd_code_log_options_Filter_data 0x0004 // 數據過濾
# define lcd_code_log_options_AT_Parsing 0x0008 // 指令解析
# define lcd_code_log_options_Type_conversion 0x0010 // 數據類型轉換
# define lcd_code_log_options_Deconstruct 0x0020 // 解字模
# define lcd_code_log_options_Update_interface 0x0040 // 刷界面 Interface
# define lcd_code_log_options_Output_interface 0x0080 // 輸出 Interface
// 日報位置狀態
# define lcd_code_log_options_tatus_conventional 0X0100 // 日報狀態正常
# define lcd_code_log_options_tatus_Warning 0x0200 // 日報狀態異常
// 輸出位置狀態
# define lcd_code_log_options_terminal 0X1000 // 輸出到終端
# define lcd_code_log_options_file 0x2000 // 輸出到文件
// ----------------------------------------------------------------------------------
struct Debug_Message_data{
unsigned long logo_out_Sign;
unsigned int length;
unsigned char logo_out_sbus[4096];
};
// ----------------------------------------------------------------------------------
// 清除調試數據
void Clean_Debug_Message_Module_data(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
Debug_Message->logo_out_Sign = 0;
Debug_Message->length = 0;
memset((void*)Debug_Message->logo_out_sbus,0,4096);
}
// printf
void log_Debug_Message_Module_add_printf(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&(Debug_Message->logo_out_sbus[Debug_Message->length]),"%s",system_printf);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加數據頭
void log_Debug_Message_Module_add_head(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&(Debug_Message->logo_out_sbus[Debug_Message->length]),"%s",properties_head);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加參數
void log_Debug_Message_Module_add_data(par_type Debug_data_addr,char parameter){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%d",parameter);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加分號
void log_Debug_Message_Module_code_semicolon(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_add_semicolon);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加尾部
void log_Debug_Message_Module_code_end(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_con_end);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加時間
void log_Debug_Message_Module_add_Time(par_type Debug_data_addr,par_type label_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
char * label = (char *)label_addr;
time_t t_time;
struct tm *tm_time;
// 時間轉換
t_time = time(NULL);
tm_time = localtime(&t_time);
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%4d:%02d:%02d-%02d:%02d:%02d -- %s:",1900+tm_time->tm_year,tm_time->tm_mon,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec,label);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加字符串
void log_Debug_Message_Module_add_string(par_type Debug_data_addr,unsigned char * data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",data_addr);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加尾部 output終端
void log_Debug_Message_Module_terminal_end(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_terminal_end);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// 添加尾部 output 文件output.txt
void log_Debug_Message_Module_file_end(par_type Debug_data_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_terminal_file);
Debug_Message->length = strlen(Debug_Message->logo_out_sbus);
}
// ----------------------------------------------------------------------------------
void printfss(par_type Debug_data_addr){
int count = 0;
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr;
for(count = 0; count < 4096;count++){
printf("%c",Debug_Message->logo_out_sbus[count]);
}
}
// ----------------------------------------------------------------------------------
// 正常日報
void log_Debug_Message_conventional_output(par_type Debug_Message_addr,par_type label_addr,par_type sbuf_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
char * sbuf = (char *)sbuf_addr;
unsigned int Output_Sign = (Debug_Message->logo_out_Sign)&0xf000;
Clean_Debug_Message_Module_data(Debug_Message_addr); // 清理數據
log_Debug_Message_Module_add_printf(Debug_Message_addr); // 添加指令printf
log_Debug_Message_Module_add_head(Debug_Message_addr); // 添加數據頭
log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_black); // 添加參數
log_Debug_Message_Module_code_end(Debug_Message_addr); // 添加尾部
log_Debug_Message_Module_add_Time(Debug_Message_addr,label_addr); // 添加時間
log_Debug_Message_Module_add_string(Debug_Message_addr,sbuf); // 添加字符串
log_Debug_Message_Module_terminal_end(Debug_Message_addr); // 添加尾部
switch(Output_Sign){ // 文件存儲位置
case lcd_code_log_options_terminal:{log_Debug_Message_Module_terminal_end(Debug_Message_addr);}break;
case lcd_code_log_options_file:{log_Debug_Message_Module_file_end(Debug_Message_addr);}break;
default:{;}break;
}
system((const char *)(Debug_Message->logo_out_sbus)); // 輸出日志
}
// 警告日報
void log_Debug_Message_Warning_output(par_type Debug_Message_addr,par_type label_addr,par_type sbuf_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
char * sbuf = (char *)sbuf_addr;
unsigned int Output_Sign = (Debug_Message->logo_out_Sign)&0xf000;
Clean_Debug_Message_Module_data(Debug_Message_addr); // 清理數據
log_Debug_Message_Module_add_printf(Debug_Message_addr); // 添加指令printf
log_Debug_Message_Module_add_head(Debug_Message_addr); // 添加數據頭
log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_brightness_High); // 添加參數
log_Debug_Message_Module_code_semicolon(Debug_Message_addr); // 添加分號
log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_red); // 添加參數
log_Debug_Message_Module_code_end(Debug_Message_addr); // 添加尾部
log_Debug_Message_Module_add_Time(Debug_Message_addr,label_addr); // 添加時間
log_Debug_Message_Module_add_string(Debug_Message_addr,sbuf); // 添加字符串
switch(Output_Sign){ // 文件存儲位置
case lcd_code_log_options_terminal:{log_Debug_Message_Module_terminal_end(Debug_Message_addr);}break;
case lcd_code_log_options_file:{log_Debug_Message_Module_file_end(Debug_Message_addr);}break;
default:{;}break;
}
system((const char *)(Debug_Message->logo_out_sbus)); // 輸出日志
}
// ----------------------------------------------------------------------------------
// lcd硬件數據
# define log_conventional_lcd_hardware_data(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"硬件數據",sbuf_addr) // 正常日報
# define log_Warning_lcd_hardware_data(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"硬件數據",sbuf_addr) // 警告日報
// 數據初始化
# define log_conventional_Data_initialization(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"數據初始",sbuf_addr) // 正常日報
# define log_Warning_Data_initialization(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"數據初始",sbuf_addr) // 警告日報
// 數據過濾
# define log_conventional_lcd_Data_filtering(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"數據過濾",sbuf_addr) // 正常日報
# define log_Warning_lcd_Data_filtering(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"數據過濾",sbuf_addr) // 警告日報
// 指令解析
# define log_conventional_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"指令解析",sbuf_addr) // 正常日報
# define log_Warning_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"指令解析",sbuf_addr) // 警告日報
// 數據類型轉換
# define log_conventional_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"編碼轉換",sbuf_addr) // 正常日報
# define log_Warning_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"編碼轉換",sbuf_addr) // 警告日報
// 解字模
# define log_conventional_lcd_Deconstruct(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"解析字模",sbuf_addr) // 正常日報
# define log_Warning_lcd_Deconstruct(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"解析字模",sbuf_addr) // 警告日報
// 刷界面 Update Interface
# define log_conventional_lcd_Update_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"刷新界面",sbuf_addr) // 正常日報
# define log_Warning_lcd_Update_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"刷新界面",sbuf_addr) // 警告日報
// 輸出界面 Interface
# define log_conventional_lcd_output_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"輸出界面",sbuf_addr) // 正常日報
# define log_Warning_lcd_output_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"輸出界面",sbuf_addr) // 警告日報
// ----------------------------------------------------------------------------------
// 正常
void log_Debug_Message_Module_conventional_Process_Sign(par_type Debug_Message_addr,par_type sbuf_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
unsigned int Process_Sign = (Debug_Message->logo_out_Sign)&0x00ff; // 流程
switch(Process_Sign){
case lcd_code_log_options_Hardware_data:{log_conventional_lcd_hardware_data(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Initialization_data:{log_conventional_Data_initialization(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Filter_data:{log_conventional_lcd_Data_filtering(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_AT_Parsing:{log_conventional_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Type_conversion:{log_conventional_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Deconstruct:{log_conventional_lcd_Deconstruct(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Update_interface:{log_conventional_lcd_Update_Interface(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Output_interface:{log_conventional_lcd_output_Interface(Debug_Message_addr,sbuf_addr);}break;
default :{log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"logo Warning",(par_type)":logo_out_Sign Parameter error");}break;
}
}
// 警告日報
void log_Debug_Message_Module_Warning_Process_Sign(par_type Debug_Message_addr,par_type sbuf_addr){
struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr;
unsigned int Process_Sign = (Debug_Message->logo_out_Sign)&0x00ff; // 流程
switch(Process_Sign){
case lcd_code_log_options_Hardware_data:{log_Warning_lcd_hardware_data(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Initialization_data:{log_Warning_Data_initialization(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Filter_data:{log_Warning_lcd_Data_filtering(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_AT_Parsing:{log_Warning_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Type_conversion:{log_Warning_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Deconstruct:{log_Warning_lcd_Deconstruct(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Update_interface:{log_Warning_lcd_Update_Interface(Debug_Message_addr,sbuf_addr);}break;
case lcd_code_log_options_Output_interface:{log_Warning_lcd_output_Interface(Debug_Message_addr,sbuf_addr);}break;
default :{log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"logo Warning",(par_type)"logo_out_Sign Parameter error");}break;
}
}
// ----------------------------------------------------------------------------------
void log_Debug_Message_output(par_type sbuf_addr,unsigned int mode){
struct Debug_Message_data Debug_Message;
unsigned int status_Sign = mode&0x0f00;
Debug_Message.logo_out_Sign = mode;
// 日志
switch(status_Sign){
case lcd_code_log_options_tatus_conventional:{
log_Debug_Message_Module_conventional_Process_Sign((par_type)(&Debug_Message),sbuf_addr); // 正常
}break;
case lcd_code_log_options_tatus_Warning:{
log_Debug_Message_Module_Warning_Process_Sign((par_type)(&Debug_Message),sbuf_addr); // 異常
}break;
default :{log_Debug_Message_Warning_output((par_type)&Debug_Message,(par_type)"logo Warning",(par_type)"status_Sign Parameter error");}break;
}
}
// ----------------------------------------------------------------------------------
void main(void){
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Hardware_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Initialization_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Filter_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_AT_Parsing|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Type_conversion|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Deconstruct|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Update_interface|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
log_Debug_Message_output((par_type)"jikexianfeng@outlook.com",(lcd_code_log_options_Output_interface|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal));
}
// ---------------------------------------------------------------------------------------------------------------------------------
測試代碼:https://www.cnblogs.com/jikexianfeng/p/13830385.html
