stdlib dan keluaran berwarna dalam C

125

Saya membuat aplikasi sederhana yang membutuhkan keluaran berwarna. Bagaimana saya bisa membuat output saya berwarna seperti emacs dan bash lakukan?

Saya tidak peduli dengan Windows, karena aplikasi saya hanya untuk sistem UNIX.

mdml
sumber

Jawaban:

288

Semua emulator terminal modern menggunakan kode pelarian ANSI untuk menunjukkan warna dan hal lainnya.
Jangan repot-repot dengan perpustakaan, kodenya sangat sederhana.

Info lebih lanjut ada di sini .

Contoh dalam 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;
}
Andrejs Cainikovs
sumber
1
Tapi saya kira saya bisa menjalankan bash dalam emulasi terminal yang tidak mendukung ANSI melarikan diri seqs.
ShinTakezou
Bendera yang bagus :) Hanya nit yang pertanyaannya ditandai 'c', bukan 'c ++'
Stephen
@ShinTakezou: Ya .. Dalam hal ini semua kode pelarian ANSI akan diabaikan, dan Anda tidak akan memiliki opsi untuk membuat output yang mewah.
Andrejs Cainikovs
14
Sequence escape ANSI tidak diinterpretasikan oleh shell, mereka diinterpretasikan oleh emulator terminal.
ninjalj
6
Terutama menyukai "jangan repot-repot dengan perpustakaan"! Kode ANSI bahkan berfungsi di command prompt Windows.
SzG
15

Berurusan dengan urutan warna dapat menjadi berantakan dan sistem yang berbeda mungkin menggunakan Indikator Urutan Warna yang berbeda.

Saya sarankan Anda mencoba menggunakan ncurses . Selain warna, ncurses dapat melakukan banyak hal lain dengan UI konsol.


sumber
Apakah menggunakan urutan warna yang berbeda menjadi alasan saya tidak dapat menemukan file "colors.h" dengan semua pekerjaan yang dilakukan untuk saya?
Cool Javelin
10

Anda dapat menampilkan kode kontrol warna khusus untuk mendapatkan keluaran terminal berwarna, berikut adalah sumber yang bagus tentang cara mencetak warna .

Sebagai contoh:

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

EDIT: Asli saya menggunakan kode warna prompt, yang tidak berfungsi :( Yang ini tidak (saya mengujinya).

Stephen
sumber
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~Tidak lebih dari banyak kesalahan kompilasi :(
Selain itu, aplikasi saya tidak boleh tergantung pada BASH.
@ Raja: Ini bukan tergantung BASH, ia bekerja di shell lain juga (tapi saya yakin tidak semua). Saya memverifikasi dalam ksh, dan csh. Catatan saya mengedit kode kontrol agar berfungsi dengan benar.
Stephen
2
Tidak akan. Itu tergantung pada emulasi terminal. Jika ANSI memahami urutan pelarian ANSI, maka Anda akan memiliki warna, huruf tebal, atau apa pun.
ShinTakezou
@Stephen Bonus: Ubah 22dengan 1melihatnya dalam huruf tebal .
xxx ---
9

Anda dapat menetapkan satu warna untuk setiap fungsi agar lebih bermanfaat.

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

Seperti bijaksana Anda dapat memilih kode warna yang berbeda dan membuatnya lebih generik.

Praveen S
sumber
3

Jika Anda menggunakan warna yang sama untuk seluruh program, Anda dapat menentukan printf()fungsi.

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

Karena Anda tidak dapat mencetak karakter dengan pemformatan string. Anda juga dapat memikirkan untuk menambahkan format dengan sesuatu seperti ini

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

f format seperti dalam printf

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

akan dicetak blue bar

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

akan dicetak red 97

baz
sumber
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;
}

membaca Wikipedia :

  • \ x1b [0m mengatur ulang semua atribut
  • \ x1b [31m menetapkan warna latar depan menjadi merah
  • \ x1b [44m akan mengatur latar belakang menjadi biru.
  • keduanya: \ x1b [31; 44m
  • keduanya tetapi terbalik: \ x1b [31; 44; 7m
  • ingat untuk mengatur ulang setelah itu \ x1b [0m ...
Ladon
sumber