printf打印的字符串显示不同颜色:https://www.cnblogs.com/jikexianfeng/p/13807231.html
ubuntu@ubuntu:~/code/log$ tree . ├── main ├── main.c ├── user_lcd_log.c └── user_lcd_log.h 0 directories, 4 files
main.c
// ---------------------------------------------------------------------------------- # include <stdio.h> # include "user_lcd_log.h" // ---------------------------------------------------------------------------------- void main(void){ set_Status_record_value(lcd_code_log_options_tatus_all | lcd_code_log_options_all); // 输出 log_Debug_Message_output_data((par_type)"abc111",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_Debug|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc222",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc333",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc444",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_Error|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc555",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_Debug|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc666",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc777",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal)); log_Debug_Message_output_data((par_type)"abc888",(par_type)"jikexianfeng",(lcd_code_log_options_tatus_Error|lcd_code_log_options_terminal)); }
user_lcd_log.h
#ifndef __USER_LCD_LOG__H__ #define __USER_LCD_LOG__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 " "" // 尾部 # define Control_code_file_end " >>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_tatus_Debug 0x0001 // 调试数据打印(绿色) # define lcd_code_log_options_tatus_conventional 0X0002 // 日常数据打印(黑色) # define lcd_code_log_options_tatus_Warning 0x0004 // 警告数据打印(黄色) # define lcd_code_log_options_tatus_Error 0x0008 // 报错数据打印(红色) # define lcd_code_log_options_tatus_all (lcd_code_log_options_tatus_Debug | lcd_code_log_options_tatus_conventional | lcd_code_log_options_tatus_Warning | lcd_code_log_options_tatus_Error) // 输出位置状态 # define lcd_code_log_options_terminal 0X0010 // 输出到终端 # define lcd_code_log_options_file 0x0020 // 输出到文件 # define lcd_code_log_options_all (lcd_code_log_options_terminal | lcd_code_log_options_file) // 所有标签 # define lcd_code_log_all (lcd_code_log_options_tatus_all | lcd_code_log_options_all) // ---------------------------------------------------------------------------------- void set_Status_record_value(unsigned int Status_value); // 配置 void log_Debug_Message_output(par_type file_addr,par_type func_addr,par_type line,par_type label_addr,par_type sbuf_addr,unsigned int mode); // ---------------------------------------------------------------------------------- // printf("%s => %s => %d ",__FILE__,__func__,__LINE__); // 文件 函数 行数 # define log_Debug_Message_output_data(label_addr,sbuf_addr,mode) log_Debug_Message_output((par_type)( __FILE__ ),(par_type)&(__func__),__LINE__,label_addr,sbuf_addr,mode) // ---------------------------------------------------------------------------------- #endif
user_lcd_log.c
// ---------------------------------------------------------------------------------- # include <stdio.h> # include <string.h> # include <time.h> # include <stdlib.h> # include "user_lcd_log.h" // ---------------------------------------------------------------------------------- // 数据缓存 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 file_addr,par_type func_addr,par_type line,par_type label_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; char * file = (char *)file_addr; char * func = (char *)func_addr; //unsigned int line = line_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 >> %s >> %04d >> %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,file,func,line,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_file_end); 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]); } } // ---------------------------------------------------------------------------------- // "printf " 33[1;31m2020:09:19-09:09:53 -- 刷新界面:jikexianfeng@outlook.com "" void log_Debug_Message_grade_output(par_type Debug_Message_addr,par_type file_addr,par_type func_addr,par_type line,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 long Grade_Sign = (Debug_Message->logo_out_Sign)&lcd_code_log_options_tatus_all; // 日志等级 unsigned long Output_Sign = (Debug_Message->logo_out_Sign)&lcd_code_log_options_all; // 输出文件 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); // 添加参数(粗体) switch(Grade_Sign){ // 日志等级 case lcd_code_log_options_tatus_Debug:{ // 调试数据打印(绿色) log_Debug_Message_Module_code_semicolon(Debug_Message_addr); // 添加分号 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_green); // 添加参数 }break; case lcd_code_log_options_tatus_conventional:{ // 日常数据打印(黑色) log_Debug_Message_Module_code_semicolon(Debug_Message_addr); // 添加分号 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_black); // 添加参数 }break; case lcd_code_log_options_tatus_Warning:{ // 警告数据打印(黄色) log_Debug_Message_Module_code_semicolon(Debug_Message_addr); // 添加分号 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_yellow); // 添加参数 }break; case lcd_code_log_options_tatus_Error:{ // 报错数据打印(红色) log_Debug_Message_Module_code_semicolon(Debug_Message_addr); // 添加分号 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_red); // 添加参数 }break; default:{;}break; } log_Debug_Message_Module_code_end(Debug_Message_addr); // 添加尾部 log_Debug_Message_Module_add_Time(Debug_Message_addr,file_addr,func_addr,line,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)); // 输出日志 } // ---------------------------------------------------------------------------------- // 配置使能 unsigned int Status_record_value; void set_Status_record_value(unsigned int Status_value){ Status_record_value = Status_value; } // 使能 void log_Debug_Message_output_EN(par_type Debug_Message_addr,par_type file_addr,par_type func_addr,par_type line,par_type label_addr,par_type sbuf_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr; switch(Debug_Message->logo_out_Sign & lcd_code_log_options_tatus_all){ // 日志等级 case lcd_code_log_options_tatus_Debug:{ // 调试数据打印(绿色) if(Status_record_value&lcd_code_log_options_tatus_Debug){ log_Debug_Message_grade_output(Debug_Message_addr,file_addr,func_addr,line,label_addr,sbuf_addr);break; } } case lcd_code_log_options_tatus_conventional:{ // 日常数据打印(黑色) if(Status_record_value&lcd_code_log_options_tatus_conventional){ log_Debug_Message_grade_output(Debug_Message_addr,file_addr,func_addr,line,label_addr,sbuf_addr);break; } } case lcd_code_log_options_tatus_Warning:{ // 警告数据打印(黄色) if(Status_record_value&lcd_code_log_options_tatus_Warning){ log_Debug_Message_grade_output(Debug_Message_addr,file_addr,func_addr,line,label_addr,sbuf_addr);break; } } case lcd_code_log_options_tatus_Error:{ // 报错数据打印(红色) if(Status_record_value&lcd_code_log_options_tatus_Error){ log_Debug_Message_grade_output(Debug_Message_addr,file_addr,func_addr,line,label_addr,sbuf_addr);break; } } default:{;}break; } } // ---------------------------------------------------------------------------------- void log_Debug_Message_output(par_type file_addr,par_type func_addr,par_type line,par_type label_addr,par_type sbuf_addr,unsigned int mode){ struct Debug_Message_data Debug_Message; unsigned int status_Sign = mode&lcd_code_log_all; Debug_Message.logo_out_Sign = mode; // 日志 log_Debug_Message_output_EN((par_type)(&Debug_Message),file_addr,func_addr,line,label_addr,sbuf_addr); } // ----------------------------------------------------------------------------------
结果: