首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 終端彩色輸出:ANSI 轉義序列在 C 語言中的實現與封裝

     編輯:關於C語言

Linux 終端彩色輸出:ANSI 轉義序列在 C 語言中的實現與封裝

Linux 終端支持 ANSI 轉義序列實現彩色文本輸出。本文介紹基本原理、常用顏色代碼、C 語言封裝函數與實用工具代碼。

ANSI 轉義序列基礎

格式:\033[<參數>m 或 \x1b[<參數>m

  • \033 / \x1b:ESC 字符(八進制/十六進制)
  • [:控制序列引導符 (CSI)
  • 參數:顏色/屬性代碼,多參數用 ; 分隔
  • m:設置圖形模式 (SGR)

常用顏色與屬性代碼表

類別代碼效果
前景色30-37標準顏色:黑紅綠黃藍洋紅青白
90-97高亮顏色(亮色版)
背景色40-47標準背景色
100-107高亮背景色
屬性0重置所有屬性(關鍵!)
屬性1粗體/高亮
屬性4下劃線
屬性7反轉前景/背景

標準 16 色對照表

前景色    背景色    顏色
30 / 90   40 / 100  黑 / 亮黑(灰)
31 / 91   41 / 101  紅 / 亮紅
32 / 92   42 / 102  綠 / 亮綠
33 / 93   43 / 103  黃 / 亮黃
34 / 94   44 / 104  藍 / 亮藍
35 / 95   45 / 105  洋紅 / 亮洋紅
36 / 96   46 / 106  青 / 亮青
37 / 97   47 / 107  白 / 亮白

C 語言基礎封裝

#include 

// 設置前景色
void set_fg(int color) {  // 30-37, 90-97
    printf("\033[%dm", color);
}

// 設置背景色
void set_bg(int color) {  // 40-47, 100-107
    printf("\033[%dm", color);
}

// 設置屬性
void set_attr(int attr) {  // 0,1,4,7
    printf("\033[%dm", attr);
}

// 組合設置
void set_color(int fg, int bg, int attr) {
    printf("\033[%d;%d;%dm", attr, fg, bg);
}

// 重置
void reset_color() {
    printf("\033[0m");
}

// 便捷宏
#define RED()      printf("\033[31m")
#define GREEN()    printf("\033[32m")
#define YELLOW()   printf("\033[33m")
#define BLUE()     printf("\033[34m")
#define RESET()    printf("\033[0m")

// 使用示例
int main() {
    RED(); printf("錯誤:"); RESET(); printf("文件未找到\n");
    GREEN(); printf("成功:"); RESET(); printf("操作完成\n");
    YELLOW(); printf("警告:"); RESET(); printf("磁盤空間不足\n");
    BLUE(); printf("信息:"); RESET(); printf("版本 1.0.0\n");
    
    // 組合樣式
    set_color(97, 41, 1);  // 亮白字、紅背景、粗體
    printf(" 關鍵錯誤 ");
    reset_color();
    printf("\n");
    return 0;
}

進階:隨機彩色字符工具(原文代碼改進版)

#include 
#include 
#include 
#include 

int main(int argc, char **argv) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s  [string2] ...\n", argv[0]);
        return 1;
    }

    srand(time(NULL));
    for (int i = 1; i < argc; i++) {
        int len = strlen(argv[i]);
        for (int j = 0; j < len; j++) {
            // 30-37: 標準前景色;1: 粗體
            int color = 30 + rand() % 8;
            int attr = rand() % 2;  // 0或1
            printf("\033[%d;%dm%c", attr, color, argv[i][j]);
        }
        printf(" ");  // 參數間空格
    }
    printf("\033[0m\n");  // 統一重置
    return 0;
}

編譯運行:

$ gcc color_print.c -o color_print
$ ./color_print Hello World
# 每字符隨機顏色輸出

256 色與真彩色(24-bit)擴展

現代終端(GNOME Terminal, iTerm2, Windows Terminal 等)支持:

// 256 色模式
printf("\033[38;5;%dm", color_id);      // 前景 0-255
printf("\033[48;5;%dm", color_id);      // 背景 0-255

// 真彩色 (RGB)
printf("\033[38;2;%d;%d;%dm", r, g, b); // 前景 RGB
printf("\033[48;2;%d;%d;%dm", r, g, b); // 背景 RGB

檢測支持:檢查環境變量 COLORTERM=truecolor 或 TERM=xterm-256color。

跨平台注意事項

  • Linux/macOS:原生支持 ANSI
  • Windows 10+:CMD/PowerShell 默認支持,舊版需調用 SetConsoleMode(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
  • 輸出重定向:管道/文件重定向時應禁用顏色(檢查 isatty(fileno(stdout)))

工程封裝建議

// logger.h
typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR } LogLevel;

void log_print(LogLevel level, const char* fmt, ...);

// logger.c
void log_print(LogLevel level, const char* fmt, ...) {
    static const char* colors[] = { "\033[36m", "\033[32m", "\033[33m", "\033[31m" };
    static const char* tags[]   = { "[DEBUG]", "[INFO]", "[WARN]", "[ERROR]" };
    
    if (!isatty(fileno(stdout))) {  // 非終端不輸出顏色
        colors[0] = colors[1] = colors[2] = colors[3] = "";
    }
    
    va_list args;
    va_start(args, fmt);
    printf("%s%s\033[0m ", colors[level], tags[level]);
    vprintf(fmt, args);
    printf("\n");
    va_end(args);
}

總結

ANSI 轉義序列是終端彩色輸出的標準方式。核心記住:\033[0m 必須成對使用重置,否則後續輸出將繼承顏色屬性。封裝為日誌庫或工具函數,配合 isatty 檢測,即可獲得專業級的終端輸出體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved