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

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

在平常的调试中,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");	#endifreturn 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive环境搭建(内置数据库)

实验目的】 1) 了解hive的作用 2) 熟练hive的配置过程&#xff08;内置数据库&#xff09; 【实验原理】 Hive的架构是由Client、Metastore、Driver、Compiler构成&#xff0c;执行流程是编译器可以将一个Hive QL转换成操作符&#xff0c;操作符是Hive中的最小处理单元。…

如何查看操作系统的性能指标:CPU、内存、磁盘、网络

目录 本系列专栏 CPU篇 CPU使用率&#xff1a;top CPU负载&#xff1a;uptime CPU核心使用情况&#xff1a;mpstat -P ALL 1 上下文切换&#xff1a;vmstat 1 CPU等待 IO时长&#xff1a;iostat -x 1 CPU的频率&#xff1a;lscpu 或者 cat /proc/cpuinfo | grep "cpu MHZ…

oracle读写时相关字符集详解

服务器端操作系统&#xff08;Oracle linux&#xff09;字符集 服务器端数据库字符集 客户端操作系统&#xff08;Oracle linux&#xff09;字符集 客户端工具sqlplus字符集 结论1&#xff1a;客户端工具sqlplus的会话&#xff0c;使用的字符集&#xff0c;是数据库字符集。…

Spring三级缓存是如何作用的

什么是三级缓存 singletonObjects&#xff1a; 一级缓存&#xff0c;用于保存实例化、注入、初始化完成的bean实例【完全体】earlySingletonObjects&#xff1a; 二级缓存&#xff0c;用于保存实例化完成的bean实例singletonFactories&#xff1a; 三级缓存&#xff0c;用于保…

java面向对象总结

java面向对象篇到这里就已经结束了&#xff0c;有什么不懂的地方可以逐一进行重新观看。希望大家能够从入门到起飞。 Java面向对象基础篇综合训练&#xff08;附带全套源代码及逐语句分析&#xff09;-&#xff1e;基于javabeen Java面向对象进阶篇综合训练&#xff08;附带全…

2024 Java 高分面试宝典 一站式搞定技术面

前言 每年9月和10月&#xff0c;被业界称为“金九银十”&#xff0c;这是人才市场一年中最活跃的时期。此时&#xff0c;企业为了来年的业务扩展&#xff0c;纷纷加大招聘力度&#xff0c;空缺岗位众多&#xff0c;招聘需求集中。同时&#xff0c;初秋的招聘活动也避开酷暑&am…

操作系统:高级IO

高级IO 1.关于IO IO的基本类型&#xff1a; I代表输入(Input): 从外部设备或来源&#xff08;如键盘、鼠标、文件、网络&#xff09;读取数据到计算机中。示例&#xff1a;用户键入的文本、从文件读取的数据、从网络接收到的数据包。 O代表输出(Output): 将计算机处理后的数据发…

git 版本回退-idea

1、选中项目&#xff0c;右键&#xff0c;打开 git历史提交记录 2、选中想要回退的版本&#xff0c;选择 hard&#xff08;不保留版本记录&#xff09; 3、最终选择强制提交&#xff08;必须强制&#xff09; OK&#xff0c;搞定

OpenCV 图像预处理—图像金字塔

文章目录 相关概念高斯金字塔拉普拉斯金字塔应用 构建高斯金字塔为什么要对当前层进行模糊&#xff1f;1. 平滑处理2. 减少混叠&#xff08;Aliasing&#xff09;3. 多尺度表示4. 图像降采样 举个栗子创建高斯金字塔和拉普拉斯金字塔&#xff0c;并用拉普拉斯金字塔恢复图像 相…

【PyTorch】基于YOLO的多目标检测项目(二)

【PyTorch】基于YOLO的多目标检测项目&#xff08;一&#xff09; 【PyTorch】基于YOLO的多目标检测项目&#xff08;二&#xff09; YOLO-v3网络由跨距为2的卷积层、跳跃连接层和上采样层组成&#xff0c;没有池化层。网络接收一幅416 * 416的图像作为输入&#xff0c;并提供三…

C++从入门到入土(三)--6个默认成员函数

目录 前言 什么是默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特性 赋值运算符重载 特性 前言 很久没有更新文章了&#xff0c;最近把类和对象相关的知识重新回顾了一遍&#xff0c;打算从今天开始继续更新C从入门到入土系列。前面我们…

DVWA中SQL注入漏洞细说

SQL注入是一种安全漏洞&#xff0c;它允许攻击者通过影响Web应用程序的后端数据库。攻击者可以通过在输入字段中插入恶意SQL代码来执行非授权查询&#xff0c;从而获取或修改数据。 在开始启动SQL注入之前我们先将DVWA的安全等级调整到Low 1、我们在SQL Injection中输入 1 and…

Linux文件恢复

很麻烦 一般还是小心最好 特别恢复的时候 可能不能选择某个文件夹去扫描恢复 所以 删除的时候 用rm -i代替rm 一定小心 以及 探索下linux的垃圾箱机制 注意 一定要恢复到不同文件夹 省的出问题 法1 系统自带工具 debugfs 但是好像不能重启&#xff1f; testdisk 1、安装 …

Flink笔记整理(四)

Flink笔记整理&#xff08;四&#xff09; 文章目录 Flink笔记整理&#xff08;四&#xff09;六、Flink中的时间和窗口6.1 窗口&#xff08;Window&#xff09;窗口的概念窗口的分类窗口API概览窗口分配器窗口函数&#xff08;Window Functions&#xff09; 6.2 时间语义&…

MySQL的库操作和表操作

文章目录 MYSQLSQL语句分类服务器&#xff0c;数据库和表的关系 库操作表操作 MYSQL SQL语句分类 DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&#xff0…

关键路径算法(Critical Path)

这个算法《算法导论》中并没有提及&#xff0c;很多书和博客说的有点奇怪&#xff0c;所以写本文作为笔记。 关键路径是什么 关键路径的定义非常简单&#xff1a;就是一个图中&#xff0c;权值之和最大的路径就是关键路径。 那么就可以知道关键路径不唯一。 为什么有关键路…

安装 moleculeSTM 踩坑日记

“学习 LLM &#xff0c;在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么&#xff0c;在 AI for science 领域&#xff0c;哪些 LLM 模型值得一试呢&#xff1f; 笔者认为&#xff1a; LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置&#xff0c;不存在外网 正向解析&#xff1a;域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备&#xff1a;三台机器都做下面的操作 基础配置&#xff1a;网络配置&#xff0c;关闭安全架构&#xff0c;关闭防火墙&#x…

使用langchain4j调用大模型写个聊天助手

LangChain4j是一款基于Java的高效、灵活的AI大模型应用框架&#xff0c;专为简化Java应用程序与LLMs&#xff08;大语言模型&#xff09;的集成而设计。它提供统一API和模块化设计&#xff0c;支持多种LLM提供商和嵌入模型&#xff0c;以及丰富的工具箱&#xff0c;如AI服务和R…