stdlib ve C'de renkli çıktı


125

Renkli çıktı gerektiren basit bir uygulama yapıyorum. Çıktımı emacs ve bash gibi renkli hale nasıl getirebilirim?

Uygulamam yalnızca UNIX sistemleri için olduğu için Windows umrumda değil.

Yanıtlar:


288

Tüm modern terminal emülatörleri, renkleri ve diğer şeyleri göstermek için ANSI kaçış kodlarını kullanır.
Kütüphanelerle uğraşmayın, kod gerçekten basit.

Daha fazla bilgi burada .

C'deki örnek:

#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
Ama ANSI kaçış sıralarını desteklemeyen bir uçbirim öykünmesinde bash çalıştırabileceğimi düşünüyorum.
ShinTakezou

Güzel bayrak :) Sorunun 'c ++' değil 'c' olarak etiketlenmesi sadece bir nit
Stephen

@ShinTakezou: Evet .. Bu durumda tüm ANSI çıkış kodları yok sayılacak ve süslü çıktı almak için hiçbir seçeneğiniz olmayacak.
Andrejs Cainikovs

14
ANSI kaçış dizileri kabuklar tarafından yorumlanmaz, terminal öykünücüler tarafından yorumlanırlar.
ninjalj

6
Özellikle "kütüphanelerle uğraşmayın" ı sevdi! ANSI kodları Windows komut isteminde bile çalışır.
SzG

15

Renk dizileriyle uğraşmak karışık olabilir ve farklı sistemler farklı Renk Dizisi Göstergeleri kullanabilir.

Ncurses kullanmayı denemenizi öneririm . Renk dışında ncurses, konsol kullanıcı arayüzü ile başka pek çok şey yapabilir.


Benim için yapılan onca işi içeren bir "colours.h" dosyası bulamamamın nedeni farklı renk dizileri kullanmak mı?
Cool Javelin

10

Renkli terminal çıktıları elde etmek için özel renk kontrol kodlarının çıktısını alabilirsiniz, işte renklerin nasıl yazdırılacağıyla ilgili iyi bir kaynak .

Örneğin:

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

DÜZENLEME: Orijinal olanım çalışmayan komut istemi renk kodlarını kullandı :( Bu çalışıyor (test ettim).


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~Bir grup derleme hatasından başka bir şey yok :(

Ayrıca başvurum BASH'a bağlı olmamalıdır.

@Koning: Bu BASH'a bağlı değil, diğer kabuklarda da çalışıyor (ama hepsinde değil eminim). Ksh ve csh ile doğruladım. Not Düzgün çalışması için kontrol kodunu düzenledim.
Stephen

2
Olmayacak. Terminal öykünmesine bağlıdır. ANSI'nin ANSI kaçış dizilerini anlaması ise, renklerinize, kalınlara veya her neyse ona sahip olacaksınız.
ShinTakezou

@Stephen Bonus: Değişim 22tarafından 1da görmek için cesur .
xxx -

9

Her işlevselliği daha kullanışlı hale getirmek için bir renk atayabilirsiniz.

#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");
}

Bilge gibi, farklı renk kodları seçebilir ve bunu daha genel hale getirebilirsiniz.


3

Programın tamamı için aynı rengi kullanırsanız, printf()fonksiyon tanımlayabilirsiniz .

   #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

Çünkü dizge biçimindeki bir karakteri yazdıramazsınız. Bunun gibi bir format eklemeyi de düşünebilirsiniz.

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

f biçimidir printf

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

yazdıracak blue bar

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

yazdıracak 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 okunuyor :

  • \ x1b [0m tüm öznitelikleri sıfırlar
  • \ x1b [31m , ön plan rengini kırmızıya ayarlar
  • \ x1b [44m arka planı maviye ayarlar.
  • her ikisi: \ x1b [31; 44m
  • hem ama ters çevrilmiş: \ x1b [31; 44; 7m
  • daha sonra sıfırlamayı unutmayın \ x1b [0m ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.