printf 在Linux终端上输出彩色字体 (串口也适用)

本文介绍了一种在Linux终端中使用不同颜色进行调试信息打印的方法。通过定义宏来改变输出文字的颜色,适用于各种调试等级的信息展示。

 

有时我们希望在LINUX终端上按照调试级别打印不同颜色的调试信息,如

 

#include <stdio.h>
/*
#define DBG_PRINT(format, arg...)   do { fprintf(stdout,"%ld,%d,[flash_sn]--- "format"\n",\
                                                 get_current_time(),getpid(),## arg);} \
												 
*/											 
#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"

#define BOLD                 "\e[1m"
#define UNDERLINE            "\e[4m"
#define BLINK                "\e[5m"
#define REVERSE              "\e[7m"
#define HIDE                 "\e[8m"
#define CLEAR                "\e[2J"
#define CLRLINE              "\r\e[K" //or "\e[1K\r"


//#define NONE                 \e[0m
//#define RED                  \e[0;31m
#define printr(format, arg...) do{printf(RED format NONE,## arg);}while(0)
#define printg(format, arg...) do{printf(GREEN format NONE,## arg);}while(0)
#define printb(format, arg...) do{printf(BLUE format NONE,## arg);}while(0)
#define printk(format, arg...) do{printf(BLACK format NONE,## arg);}while(0)
#define printw(format, arg...) do{printf(WHITE format NONE,## arg);}while(0)
#define printy(format, arg...) do{printf(YELLOW format NONE,## arg);}while(0)
#define printc(format, arg...) do{printf(CYAN format NONE,## arg);}while(0)
#define printp(format, arg...) do{printf(PURPLE format NONE,## arg);}while(0)	
	
#define printlr(format, arg...) do{printf(L_RED format NONE,## arg);}while(0)
#define printlg(format, arg...) do{printf(L_GREEN format NONE,## arg);}while(0)
#define printlb(format, arg...) do{printf(L_BLUE format NONE,## arg);}while(0)
#define printlk(format, arg...) do{printf(L_BLACK format NONE,## arg);}while(0)
#define printlw(format, arg...) do{printf(L_WHITE format NONE,## arg);}while(0)
//#define printly(format, arg...) do{printf(L_YELLOW format NONE,## arg);}while(0)
#define printlc(format, arg...) do{printf(L_CYAN format NONE,## arg);}while(0)
#define printlp(format, arg...) do{printf(L_PURPLE format NONE,## arg);}while(0)	
int main()
{
	
	printf("普通字体\n");
	printr("红色字体\n");
	printg("绿色字体\n");
	printb("蓝色字体\n");
	printc("青色字体\n");
	printy("黄色字体\n");
	printp("粉色字体\n");
	
	printf("--普通字体\n");
	printlr("红色字体\n");
	printlg("绿色字体\n");
	printlb("蓝色字体\n");
	printlc("青色字体\n");
	//printly("黄色字体\n");
	printlp("粉色字体\n");
	return 0;
}

资料补充:https://blog.youkuaiyun.com/slash_24/article/details/54846392

      \033[0m 关闭所有属性
      \033[1m 设置高亮度
      \033[4m 下划线
      \033[5m 闪烁
      \033[7m 反显
      \033[8m 消隐
      \033[30m 至 \33[37m 设置前景色
      \033[40m 至 \33[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 显示光标

--------------------------------------------------------------------------

各数字所代表的颜色如下:
      字背景颜色范围:40----49
      40:黑
      41:深红
      42:绿
      43:黄色
      44:蓝色
      45:紫色
      46:深绿
      47:白色

      字颜色:30----39
      30:黑
      31:红
      32:绿
      33:黄
      34:蓝色
      35:紫色
      36:深绿 
      37:白色

end

 

Linux环境下使用C语言的`printf`函数时,可能会遇到输出无法立即显示在屏幕上的问题。这通常与标准输出缓冲区的行为有关,而不是函数本身存在错误。以下是对该问题的详细解释和解决方案。 ### 缓冲区机制导致输出延迟 标准输出(stdout)在默认情况下是行缓冲的,这意味着输出不会立即刷新到屏幕,而是等到满足以下条件之一才会输出: - 缓冲区已满。 - 遇到换行符(`\n`)。 - 程序正常结束。 - 显式调用`fflush(stdout)`刷新缓冲区。 例如,以下程序中的`printf("hello world\n")`会在遇到换行符后立即输出,但如果去掉`\n`,输出将被延迟,直到缓冲区满或程序结束: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { printf("hello world"); // 没有换行符,输出可能被缓冲 sleep(3); // 程序在此暂停,但输出尚未显示 exit(0); // 程序结束时才刷新缓冲区并输出 } ``` 如果希望立即看到输出,可以在`printf`之后调用`fflush(stdout)`来强制刷新缓冲区[^1]。 ### 输出重定向或后台运行导致问题 当程序被重定向到文件或在后台运行时,标准输出可能不会直接显示在屏幕上。例如,使用以下命令运行程序时,输出将被重定向到文件而非屏幕: ```bash ./your_program > output.log & ``` 在这种情况下,即使程序中有`printf`语句,也不会在终端中看到输出内容。可以通过查看`output.log`文件来确认输出是否成功写入。 ### 终端显示控制影响输出 某些终端控制序列(如ANSI转义码)可能会影响输出的显示效果。例如,使用`\r`可以将光标移动到行首,从而覆盖当前行的内容;使用`\b`可以退格并修改已输出的字符。如果程序中包含这些控制字符,可能导致输出看起来“消失”或被覆盖[^2]。为避免此类问题,建议在调试时先移除这些特殊字符,确保输出逻辑清晰。 ### 解决方案 1. **确保输出立即刷新** 在需要即时显示输出的场景中,显式调用`fflush(stdout)`以刷新标准输出缓冲区: ```c printf("hello world"); fflush(stdout); // 强制刷新输出缓冲区 sleep(3); ``` 2. **使用换行符** 在`printf`中添加换行符`\n`可触发行缓冲机制,确保输出立即显示: ```c printf("hello world\n"); // 自动刷新缓冲区 ``` 3. **检查运行方式** 确保程序未被重定向到文件或后台运行。如需查看输出,可直接在终端中运行程序: ```bash ./your_program ``` 4. **避免终端控制字符干扰** 如果使用了ANSI控制码(如`\033[0m`恢复默认终端属性),确保它们不会干扰输出内容。调试时建议先移除这些控制序列,确认输出逻辑无误后再重新添加[^3]。 ### 总结 Linux下C语言的`printf`函数无法输出到屏幕,通常是由于标准输出缓冲机制、重定向行为或终端控制字符引起的。通过添加换行符、显式刷新缓冲区或检查运行方式,可以有效解决此类问题。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值