首页 > 编程语言 >如何让你的C语言程序打印的log多一点色彩?(超级实用)

如何让你的C语言程序打印的log多一点色彩?(超级实用)

时间:2024-08-17 11:19:25浏览次数:6  
标签:36m log Linux C语言 多一点 printf 033 define 0m

接着上一篇文章《由字节对齐引发的一场“血案“

在平常的调试中,printf字体格式与颜色都是默认一致的。
如果可以根据log信息的重要程度,配以不同的颜色与格式,可以很方便的查找到要点。

1、printf字体显示语法说明

printf(“\033[显示方式;字体颜色;背景颜色m 字符串 \033[0m” );

 语法说明:

  • 第一个\033[表示转义序列的开始,设置随后的字体格式
    转义序列是以 ESC 开头,用 \033 完成相同的工作(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':表示转义序列的结束

  • 结尾处的\033[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 清除从光标到行尾的内容
    /033[s 保存光标位置
    /033[u 恢复光标位置
    /033[?25l 隐藏光标
    /033[?25h 显示光标

注意:
其中 显示方式;字体颜色;背景颜色 可以任意组合,";"隔开即可。
使用 ANSI 转义码来设置文本样式和颜色可能会因为不同的终端软件和操作系统而产生不同的效果。
同时,这种方式也只适用于在终端上输出,如果需要在 GUI 程序中设置文本颜色等效果,则需要使用相应的 GUI 库提供的接口。

2、举例

	printf("\033[1;31mThis text is in red and bold.\033[0m\n");
	printf("\033[0;31mThis text is in red and not bold.\033[0m\n");

其中,'1' 表示加粗或高亮,'31' 表示前景色为红色,'\033[' 是转义序列的开始,'m' 是转义序列的结束,'\033[0m' 表示将属性重置为默认值。

运行结果:

方式

	printf("\033[0;36m****一口Linux*****【0;36m】\033[0m\r\n");
	printf("\033[1;36m****一口Linux*****【1;36m】\033[0m\r\n");
	printf("\033[4;36m****一口Linux*****【4;36m】\033[0m\r\n");
	printf("\033[5;36m****一口Linux*****【5;36m】\033[0m\r\n");
	printf("\033[7;36m****一口Linux*****【7;36m】\033[0m\r\n");
	printf("\033[8;36m****一口Linux*****【8;36m】\033[0m\r\n");
	printf("\033[22;36m****一口Linux*****【22;36m】\033[0m\r\n");
	printf("\033[24;36m****一口Linux*****【24;36m】\033[0m\r\n");
	printf("\033[25;36m****一口Linux*****【25;36m】\033[0m\r\n");
	printf("\033[27;36m****一口Linux*****【27;36m】\033[0m\r\n");

色谱

测试代码[仅打印字体颜色]

    printf("\033[30m****一口Linux*****【30】\033[0m\r\n");
    printf("\033[31m****一口Linux*****【31】\033[0m\r\n");
    printf("\033[32m****一口Linux*****【32】\033[0m\r\n");
    printf("\033[33m****一口Linux*****【33】\033[0m\r\n");
    printf("\033[34m****一口Linux*****【34】\033[0m\r\n");
    printf("\033[35m****一口Linux*****【35】\033[0m\r\n");	
    printf("\033[36m****一口Linux*****【36】\033[0m\r\n");
    printf("\033[37m****一口Linux*****【37】\033[0m\r\n");	

    printf("\033[40m****一口Linux*****【40】\033[0m\r\n");
    printf("\033[41m****一口Linux*****【41】\033[0m\r\n");
    printf("\033[42m****一口Linux*****【42】\033[0m\r\n");
    printf("\033[43m****一口Linux*****【43】\033[0m\r\n");
    printf("\033[44m****一口Linux*****【44】\033[0m\r\n");
    printf("\033[45m****一口Linux*****【45】\033[0m\r\n");	
    printf("\033[46m****一口Linux*****【46】\033[0m\r\n");
    printf("\033[47m****一口Linux*****【47】\033[0m\r\n");	

3、给打印信息封装

为方便打印字符串为不同颜色,我们可以将一些常用的颜色定义成宏

#define HL_TWK_RED_YEL  "\033[1m\033[5;31;43m"	//闪烁高亮红字黄底
#define HL_RED_WRT      "\033[1;31;47m"			//高亮红色白底

#define HL_RED          "\033[1;31m"				//高亮红色
#define HL_GRN          "\033[1;32m"				//高亮绿色
#define HL_YEL          "\033[1;33m"				//高亮黄色
#define HL_DGRN          "\033[1;36m"				//高亮深绿

#define PF_CLR  "\033[0m"							//清除 

将系统提供的printf函数做一个封装:

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

比如我们要打印字符串,显示为高亮黄色

myprintf(HL_YEL,"%s\n","yikoulinux");

4. 美化程序的打印log

假设我们有如下格式的通信信令:

在这里插入图片描述调试通信协议,

我们经常需要将通信的信令以16进制格式全部打印出来,

这些数据看起来非常不直观,

为方便查看log,将几个最重要字段显示出来,

比如msgType、len

		
void dump_frm(char *title,UINT8 *data,int len)
{
	int i=0;
		
	myprintf(HL_YEL,"%s\n",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');	
} 

将我们的测试针数据,放进去测试一下

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

执行结果:

可以看到,这种帧格式,看起来会更加直观,

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  "\033[1m\033[5;31;43m"	//闪烁高亮红字黄底
#define HL_RED_WRT      "\033[1;31;47m"			//高亮红色白底

#define HL_RED          "\033[1;31m"				//高亮红色
#define HL_GRN          "\033[1;32m"				//高亮绿色
#define HL_YEL          "\033[1;33m"				//高亮黄色
#define HL_DGRN          "\033[1;36m"				//高亮深绿

#define PF_CLR  "\033[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,"%s\n",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("\033[1;31mThis text is in red and bold.\033[0m\n");
	printf("\033[0;31mThis text is in red and not bold.\033[0m\n");

	
	printf("\033[0;36m****一口Linux*****【0;36m】\033[0m\r\n");
	printf("\033[1;36m****一口Linux*****【1;36m】\033[0m\r\n");
	printf("\033[4;36m****一口Linux*****【4;36m】\033[0m\r\n");
	printf("\033[5;36m****一口Linux*****【5;36m】\033[0m\r\n");
	printf("\033[7;36m****一口Linux*****【7;36m】\033[0m\r\n");
	printf("\033[8;36m****一口Linux*****【8;36m】\033[0m\r\n");
	printf("\033[22;36m****一口Linux*****【22;36m】\033[0m\r\n");
	printf("\033[24;36m****一口Linux*****【24;36m】\033[0m\r\n");
	printf("\033[25;36m****一口Linux*****【25;36m】\033[0m\r\n");
	printf("\033[27;36m****一口Linux*****【27;36m】\033[0m\r\n");
	
	

    printf("\033[30m****一口Linux*****【30】\033[0m\r\n");
    printf("\033[31m****一口Linux*****【31】\033[0m\r\n");
    printf("\033[32m****一口Linux*****【32】\033[0m\r\n");
    printf("\033[33m****一口Linux*****【33】\033[0m\r\n");
    printf("\033[34m****一口Linux*****【34】\033[0m\r\n");
    printf("\033[35m****一口Linux*****【35】\033[0m\r\n");	
    printf("\033[36m****一口Linux*****【36】\033[0m\r\n");
    printf("\033[37m****一口Linux*****【37】\033[0m\r\n");	

    printf("\033[40m****一口Linux*****【40】\033[0m\r\n");
    printf("\033[41m****一口Linux*****【41】\033[0m\r\n");
    printf("\033[42m****一口Linux*****【42】\033[0m\r\n");
    printf("\033[43m****一口Linux*****【43】\033[0m\r\n");
    printf("\033[44m****一口Linux*****【44】\033[0m\r\n");
    printf("\033[45m****一口Linux*****【45】\033[0m\r\n");	
    printf("\033[46m****一口Linux*****【46】\033[0m\r\n");
    printf("\033[47m****一口Linux*****【47】\033[0m\r\n");	
 
 #endif
    return 0;
}

标签:36m,log,Linux,C语言,多一点,printf,033,define,0m
From: https://www.cnblogs.com/yikoulinux/p/18364151

相关文章

  • 新员工一口气写完了这些C语言例子,领导给他转正了!
    持续更新中...很多想从事嵌入式Linux开发的老铁问一口君,有没有快速提升自己编程水平的小例子?一口君根据自己多年工作经验,整理了一些基于Linux的c语言的非常实用的小例子,这些例子在嵌入式开发工作中,或多或少都会用到。看看你们会做多少?一、基础C语言1.排序算法给指定数组排......
  • 【漫谈C语言和嵌入式002】嵌入式中的大小端
            在计算机科学中,"端序"(Endianness)是指多字节数据类型(如整数或浮点数)在内存中的存储方式。主要分为两种:大端模式(Big-Endian)和小端模式(Little-Endian)。大端模式(Big-Endian)       在大端模式中,多字节数据类型的最高有效字节(MSB)被存储在最低的内存地址......
  • C语言学习 --- 冒泡排序与二分查找
    冒泡排序 排序        从小到大顺序排 轮数        数据个数-1 每一次比较的次数      数据个数-1-当前的轮数      每次比较开始从下标为0的地方开始比较     轮数:0~<数据个数-1次数:0~<数......
  • 【萌新学习C语言】如何根据qsort库函数,写一个能给任何类型排序的冒泡排序。
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、sqort函数1.1qsort函数定义1.2qsort如何使用函数使用1.2.1用qsort函数,将结构体类型的name进行排序1.2.2用qsort函数,将结构体类型的age进行排序二、整数型的冒泡排序2.1冒泡排序思想三.......
  • Verilog基础:模块端口(port)的定义语法(1995)
    相关阅读Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482    Verilog中的端口定义有两种风格,一种是VerilogStandard1995风格,一种是VerilogStandard2001风格,本文将对VerilogStandard1995风格进行详细阐述。......
  • 【C语言实现花屏效果并打包程序为exe可执行文件】
    说明:该程序为临摹改良(......
  • SpringBoot整合日志功能(slf4j+logback)详解
     目录一、日志门面与日志实现1.1什么是日志门面和日志实现?1.2为什么需要日志门面?二、简介三、日志格式四、记录日志4.1使用日志工厂4.2 使用Lombok的@Slf4j注解五、日志级别5.1日志级别介绍5.2配置日志级别5.3指定某个包下的类使用某个级别5.4占位符打......
  • 解决Windows突然自动重启卡logo
    一般重启后或者卡logo我们需要查看日志进入后查看日志点击筛选当前日志输入eventlog找到重启的时间错误ID,记住这个事件ID我们再次点击筛选当前日志页面选择清除,点击确定然后我们找到关键的ID和时间这个时间点上面和下面查看一下错误的引起原因很显然这个......
  • 【C语言题目】计算某字符出现次数
    描述题目描述写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)数据范围:1≤n≤1000输入描述第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)输出描述输出......
  • 编程基础题:开关灯(C语言方式代码,C++方式代码,Python3方式编写)三种语言编写代码
    1.题目描述:假设有N蓋灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以......