stdlib และเอาต์พุตสีใน C


125

ฉันกำลังสร้างแอปพลิเคชั่นง่ายๆที่ต้องการเอาต์พุตสี ฉันจะทำให้ผลลัพธ์ของฉันเป็นสีเช่น emacs และ bash ได้อย่างไร?

ฉันไม่สนใจ Windows เนื่องจากแอปพลิเคชันของฉันใช้สำหรับระบบ UNIX เท่านั้น

คำตอบ:


288

ตัวเลียนแบบเทอร์มินัลที่ทันสมัยทั้งหมดใช้รหัสหนี ANSI เพื่อแสดงสีและสิ่งอื่น ๆ
ไม่ต้องกังวลกับไลบรารีโค้ดนั้นง่ายมาก

ข้อมูลเพิ่มเติมได้ที่นี่

ตัวอย่างใน C:

#include <stdio.h>

#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_RESET   "\x1b[0m"

int main (int argc, char const *argv[]) {

  printf(ANSI_COLOR_RED     "This text is RED!"     ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_GREEN   "This text is GREEN!"   ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_YELLOW  "This text is YELLOW!"  ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_BLUE    "This text is BLUE!"    ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\n");
  printf(ANSI_COLOR_CYAN    "This text is CYAN!"    ANSI_COLOR_RESET "\n");

  return 0;
}

1
แต่ฉันคิดว่าฉันสามารถรัน bash ในการจำลองเทอร์มินัลที่ไม่รองรับ ANSI escape seqs
ShinTakezou

ธงดี :) เพียงเล็กน้อยที่คำถามถูกแท็ก 'c' ไม่ใช่ 'c ++'
Stephen

@ShinTakezou: ใช่ .. ในกรณีนี้รหัสหลบหนี ANSI ทั้งหมดจะถูกละเว้นและคุณจะไม่มีตัวเลือกในการสร้างเอาต์พุตแฟนซี
Andrejs Cainikovs

14
ลำดับการหลีกเลี่ยง ANSI ไม่ได้ถูกตีความโดยเชลล์ แต่จะตีความโดยเทอร์มินัลอีมูเลเตอร์
ninjalj

6
ชอบโดยเฉพาะ "อย่ารำคาญกับห้องสมุด"! รหัส ANSI ทำงานได้ในพรอมต์คำสั่งของ Windows
SzG

15

การจัดการกับลำดับสีอาจทำให้ยุ่งเหยิงและระบบต่างๆอาจใช้ตัวบ่งชี้ลำดับสีที่แตกต่างกัน

ผมขอแนะนำให้คุณลองใช้ncurses นอกเหนือจากสีแล้ว ncurses ยังสามารถทำสิ่งอื่น ๆ อีกมากมายด้วยคอนโซล UI


การใช้ลำดับสีที่แตกต่างกันเป็นสาเหตุที่ทำให้ฉันไม่พบไฟล์ "colors.h" กับงานทั้งหมดที่ทำเพื่อฉันหรือไม่
โตมรเด็ด

10

คุณสามารถส่งออกรหัสควบคุมสีพิเศษที่จะได้รับการส่งออกสีเทอร์มินี่เป็นแหล่งข้อมูลที่ดีเกี่ยวกับวิธีการพิมพ์สี

ตัวอย่างเช่น:

printf("\033[22;34mHello, world!\033[0m");  // shows a blue hello world

แก้ไข: รหัสเดิมของฉันใช้รหัสสีพร้อมต์ซึ่งใช้ไม่ได้ :( อันนี้ทำ (ฉันทดสอบแล้ว)


edition.c: In function ‘int main(int, const char**)’: edition.c:4: error: unknown escape sequence '\]' edition.c:4: error: unknown escape sequence '\]' edition.c edition.c~ไม่มีอะไรมากไปกว่าข้อผิดพลาดในการคอมไพล์ :(

นอกจากนี้แอปพลิเคชันของฉันไม่ควรขึ้นอยู่กับ BASH

@ Koning: นี่ไม่ได้ขึ้นอยู่กับ BASH แต่ก็ใช้ได้กับเชลล์อื่น ๆ ด้วย (แต่ฉันแน่ใจว่าไม่ใช่ทั้งหมด) ฉันยืนยันใน ksh และ csh หมายเหตุฉันแก้ไขรหัสควบคุมให้ทำงานอย่างถูกต้อง
Stephen

2
มันจะไม่เป็น ขึ้นอยู่กับการจำลองเทอร์มินัล ถ้า ANSI เข้าใจลำดับการหลีกเลี่ยง ANSI คุณจะมีสีเป็นตัวหนาหรืออะไรก็ได้
ShinTakezou

@Stephen โบนัส:เปลี่ยน22โดย1จะเห็นมันในตัวหนา
xxx ---

9

คุณสามารถกำหนดหนึ่งสีให้กับทุกฟังก์ชันเพื่อให้มีประโยชน์มากขึ้น

#define Color_Red "\33[0:31m\\]" // Color Start
#define Color_end "\33[0m\\]" // To flush out prev settings
#define LOG_RED(X) printf("%s %s %s",Color_Red,X,Color_end)

foo()
{
LOG_RED("This is in Red Color");
}

เช่นเดียวกับที่ชาญฉลาดคุณสามารถเลือกรหัสสีที่แตกต่างกันและทำให้เป็นแบบทั่วไปได้มากขึ้น


3

หากคุณใช้สีเดียวกันทั้งโปรแกรมคุณสามารถกำหนดprintf()ฟังก์ชันได้

   #include<stdio.h>
   #define ah_red "\e[31m"
   #define printf(X) printf(ah_red "%s",X);
   #int main()
   {
        printf("Bangladesh");
        printf("\n");
        return 0;
   }

2

เนื่องจากคุณไม่สามารถพิมพ์อักขระที่มีการจัดรูปแบบสตริงได้ คุณยังสามารถคิดเพิ่มรูปแบบด้วยสิ่งนี้ได้

#define PRINTC(c,f,s) printf ("\033[%dm" f "\033[0m", 30 + c, s)

f เป็นรูปแบบในรูปแบบ printf

PRINTC (4, "%s\n", "bar")

จะพิมพ์ blue bar

PRINTC (1, "%d", 'a')

จะพิมพ์ red 97


2
#include <stdio.h>

#define BLUE(string) "\x1b[34m" string "\x1b[0m"
#define RED(string) "\x1b[31m" string "\x1b[0m"

int main(void)
{
    printf("this is " RED("red") "!\n");

    // a somewhat more complex ...
    printf("this is " BLUE("%s") "!\n","blue");

    return 0;
}

อ่านWikipedia :

  • \ x1b [0mรีเซ็ตแอตทริบิวต์ทั้งหมด
  • \ x1b [31mตั้งค่าสีพื้นหน้าเป็นสีแดง
  • \ x1b [44mจะตั้งค่าพื้นหลังเป็นสีน้ำเงิน
  • ทั้งสอง: \ x1b [31; 44 ม
  • ทั้งสอง แต่กลับกัน: \ x1b [31; 44; 7 ม
  • อย่าลืมรีเซ็ตหลังจากนั้น\ x1b [0m ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.