printf在终端输出时改变颜色

本文介绍如何使用printf函数在终端输出带颜色的文字,通过转义序列控制字符颜色,提高程序调试效率。提供了多种颜色设置示例。

printf在终端输出时改变颜色

 

 

在调试程序时,有时候要输出大量数据,如果让printf/fprintf改变输出数据的颜色,那观察数据就方便多了。

 

终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。

转义序列是以 ESC 开头,可以用 /033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27, = 用八进制表示的33)。

 

/033[显示方式;前景色;背景色m

 

显示方式: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(白色)

 

/033[0m 默认

/033[1;32;40m 绿色

033[1;31;40m 红色

 

printf( "/033[1;31;40m 输出红色字符 /033[0m" )

在调试程序时,有时候要输出大量数据,如果颜色都一样的话,辨别起来就很恼火,
如果让printf/fprintf改变输出数据的颜色,那观察数据就方便多了。

示例代码:

#include <stdio.h>
#define NONE         "/033[m"
#define RED          "/033[0;32;31m"
#define LIGHT_RED    "/033[1;31m"
#define GREEN        "/033[0;32;32m"
#define LIGHT_GREEN  "/033[1;32m"
#define BLUE         "/033[0;32;34m"
#define LIGHT_BLUE   "/033[1;34m"
#define DARY_GRAY    "/033[1;30m"
#define CYAN         "/033[0;36m"
#define LIGHT_CYAN   "/033[1;36m"
#define PURPLE       "/033[0;35m"
#define LIGHT_PURPLE "/033[1;35m"
#define BROWN        "/033[0;33m"
#define YELLOW       "/033[1;33m"
#define LIGHT_GRAY   "/033[0;37m"
#define WHITE        "/033[1;37m"

int main()
{
    printf( CYAN "current function is %s " GREEN " file line is %d/n" NONE,
            __FUNCTION__, __LINE__ );

    fprintf(stderr, RED "current function is %s " BLUE " file line is %d/n" NONE,
            __FUNCTION__, __LINE__ );
    return 0;
}


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/dedodong/archive/2007/07/02/1675528.aspx

<think>好的,用户现在想知道如何在C语言中使用printf输出颜色。之前他们已经提供了几个引用资料,我需要综合这些信息来给出一个清晰的回答。首先,我需要确认用户的使用环境,因为不同的系统可能有不同的实现方式。根据引用[1]和[3],用户可能是在Linux环境下,而引用[3]和[5]提到了Windows的控制台操作,所以应该分别说明两种系统下的方法。 接下来,需要解释ANSI转义码的基本用法,包括格式和颜色代码。引用[1]和[4]都提到了使用\033或者\x1B来开始转义序列,然后设置显示方式、前景色和背景色。要详细列出常用的颜色代码,比如31是红色前景,32是绿色等。同要提醒用户注意,在Windows下默认可能不支持ANSI,需要启用虚拟终端支持,或者使用Windows API,如引用[3]中的SetConsoleTextAttribute函数。 然后,需要给出示例代码,展示如何在Linux和Windows下分别实现颜色输出。例如,Linux下直接使用printf带转义码,而Windows下可能需要包含windows.h并使用SetConsoleTextAttribute。同,要提到跨平台处理的宏定义方法,如引用[2]中的做法,定义颜色宏来简化代码。 还要注意用户可能遇到的常见问题,比如颜色未重置导致后续输出也带有颜色,或者Windows下的兼容性问题。引用[5]提到的乱码问题可能和编码有关,但当前问题主要关注颜色,所以暂不提,除非用户后续提问。 最后,需要生成相关问题,帮助用户深入理解,比如跨平台方法、颜色未生效的原因、背景色设置以及恢复默认颜色的方法。这些问题可以引导用户进一步探索相关主题。</think>在C语言中修`printf`输出颜色主要依赖ANSI转义序列(Linux/Mac)或Windows API控制台属性。以下是具体实现方法: ### 一、ANSI转义码方法(Linux/macOS/Windows终端支持) 格式:`\033[显示方式;前景色;背景色m` ```c #include <stdio.h> int main() { // 红色文字,默认背景 printf("\033[31m这是红色文本\033[0m\n"); // 绿色背景,黄色文字,加粗 printf("\033[1;33;42m警告信息\033[0m\n"); // 闪烁的蓝色文字 printf("\033[5;34m紧急通知\033[0m\n"); return 0; } ``` #### 颜色代码表(部分) | 类型 | 代码范围 | 示例代码 | |------------|----------|-------------| | 重置 | 0 | \033[0m | | 文字颜色 | 30-37 | 31=红 | | 背景颜色 | 40-47 | 42=绿背景 | | 显示方式 | 1-8 | 1=加粗,5=闪烁 | ### 二、Windows API方法(需包含<windows.h>) ```c #include <stdio.h> #include <windows.h> int main() { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // 红色文字 SetConsoleTextAttribute(hConsole, FOREGROUND_RED); printf("错误信息\n"); // 黄色背景+蓝色文字 SetConsoleTextAttribute(hConsole, BACKGROUND_RED | BACKGROUND_GREEN | FOREGROUND_BLUE); printf("特殊提示\n"); // 恢复默认 SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); return 0; } ``` ### 三、跨平台兼容方案 ```c #ifdef _WIN32 #include <windows.h> #define SET_COLOR(color) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) #define RED_COLOR FOREGROUND_RED #else #define SET_COLOR(color) printf("\033[%dm", color) #define RED_COLOR 31 #endif int main() { SET_COLOR(RED_COLOR); printf("跨平台红色文本"); // 重置颜色 #ifdef _WIN32 SET_COLOR(7); // Windows默认灰色 #else printf("\033[0m"); #endif return 0; } ``` 注意事项: 1. ANSI方法需终端支持(Windows需开启"启用虚拟终端")[^1][^4] 2. 颜色代码必须以`\033[0m`重置,否则后续输出会继承颜色[^2] 3. Windows控制台默认有16种颜色组合,ANSI支持256色模式[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值