1、痛点吐槽
试想一下,随着项目开发持续向前推进,例如下图所示,输出的信息量非常的多,没有做任何的区分标识,是不是显得非常的杂乱无章,想要在短时间内,一眼看到核心数据或者需要的数据信息,会比较的困难,这非常的不利于开发和后期维护。
因此需要着手解决上面指出的问题,在较多的日志系统或集成化的编译器平台中,命令终端输出的信息都带有各种颜色标识,开发者可以非常清楚的区分输出的信息,哪些是核心信息,哪些是普通的打印信息,非常的清晰明了,极大的推动了项目开发的进度。
2、printf打印颜色文本
在经常使用的标准的C语言或C++中,printf 函数本身并不支持直接打印彩色文本。但是在使用printf函数时,可以通过向终端发送特定的转义序列(ANSI转义序列),以达到改变文本的颜色和样式的作用。
printf("\033[00;44;35mPASSED\033[01;0m\n");
如上所示是通过printf函数,使用ANSI转义序列实现输出颜色的一条函数指令
格式说明:
\033[ 表示的是ESC字符(ASCII码27),后面开始接的是颜色代码
00 表示的是低亮显示
; 分隔符作用
44 表示背景色为蓝色
; 分隔符作用
35m 表示字符颜色为紫色
PASSED 表示输出的字符串
字体背景颜色范围(40~49):
40 | 黑色 | |
41 | 红色 | |
42 | 绿色 | |
43 | 黄色 | |
44 | 蓝色 | |
45 | 紫色 | |
46 | 深绿色 | |
47 | 白色 |
字体颜色范围(30~39):
30 | 黑色 | |
31 | 红色 | |
32 | 绿色 | |
33 | 黄色 | |
34 | 蓝色 | |
35 | 紫色 | |
36 | 深绿色 | |
37 | 白色 |
3、参考程序代码
在下面的printf颜色调试代码中,实现了对不同的日志信息打印呈现不同的颜色,在开发过程中,根据实际的数据优先级情况,可以直接传入不同的参数进行调用,具体的实现效果,见文章末尾。
①、debug.c
#include "debug.h"
void DBUG_SHOW(int type, const char* format, ...)
{
#ifdef OPEN_DEBUG
va_list args;
char msg[256] = {0};
int written;
va_start(args, format);
written = vsnprintf(msg, sizeof(msg), format, args);
va_end(args);
if (written < 0 || written >= sizeof(msg)) {
printf("msg buffer size not enough!\n");
return;
}
switch (type)
{
case DBUG_INFO:
printf("%s", msg);
break;
case DBUG_WARN:
printf("\033[%d;%dm%s\033[01;0m", LOWLIGHT, YELLO_FONT, msg);
break;
case DBUG_ERROR:
printf("\033[%d;%dm%s\033[01;0m", HIGHLIGHT, RED_FONT, msg);
break;
case DBUG_VITAL:
printf("\033[%d;%dm%s\033[01;0m", LOWLIGHT, GREEN_FONT, msg);
break;
}
#endif
}
②、debug.h
#ifndef __DEBUG_H
#define __DEBUG_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define OPEN_DEBUG
#define LOWLIGHT 00
#define HIGHLIGHT 01
//背景色范围40~49
#define BLACK_BG 40
#define RED_BG 41
#define GREEN_BG 42
#define YELLO_BG 43
#define BLUE_BG 44
#define PURPLE_BG 45
#define DARK_GREEN_BG 46
#define WHITE_BG 47
//字符色范围30~39
#define BLACK_FONT 30
#define RED_FONT 31
#define GREEN_FONT 32
#define YELLO_FONT 33
#define BLUE_FONT 34
#define PURPLE_FONT 35
#define DARK_GREEN_FONT 36
#define WHITE_FONT 37
enum{
DBUG_INFO,
DBUG_WARN,
DBUG_ERROR,
DBUG_VITAL
};
void DBUG_SHOW(int type, const char* format, ...);
#endif
4、程序效果展示
①、测试代码
#include <stdio.h>
#include "debug.h"
int main(int argc, char**argv)
{
printf("\033[01;32mPASSED\033[0;0m\n");
printf("\033[01;31mFAILED\033[0;0m\n");
printf("\033[00;44;35mPASSED\033[01;0m\n");
printf("\033[00;43;31mFAILED\033[01;0m\n");
DBUG_SHOW(DBUG_INFO, "今天是星期六\n");
DBUG_SHOW(DBUG_WARN, "今天可能会下雨哦\n", 100, 78.234);
DBUG_SHOW(DBUG_ERROR, "现在在挂台风啊\n");
DBUG_SHOW(DBUG_VITAL, "快跑快跑...\n");
return 0;
}
②、运行结果
通过上述的代码,可以实现对终端打印输出的信息非常清晰明了的区分出来,将其运用到实际的项目代码中,可以更加直观的了解程序的运行状态,辅助开发者进行程序调试和优化等。