2010-07-10 7 views
87

Sto facendo una semplice applicazione che richiede output colorato. Come posso rendere colorato il mio output come emacs e bash do?output stdlib e colorato in C

Non mi interessa Windows, poiché la mia applicazione è solo per sistemi UNIX.

risposta

217

Tutti i moderni emulatori di terminale utilizzano codici di escape ANSI per mostrare colori e altre cose.
Non preoccupatevi delle librerie, il codice è davvero semplice.

Maggiori informazioni sono here.

Esempio in 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; 
} 
+0

Bel collegamento wiki per i codici colore. –

+1

Ma suppongo di poter eseguire bash in un'emulazione di terminale che non supporta i seq di escape ANSI. – ShinTakezou

+0

Nice flag :) Solo una nit che la domanda è taggata 'c', non 'C++' – Stephen

7

È possibile emettere codici di controllo colore speciali per ottenere l'output del terminale colorato, ecco una buona risorsa su how to print colors.

Ad esempio:

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

EDIT: Il mio unico originale utilizzato codici di colore rapide, che non funziona :(Questo lo fa (ho testato)

+0

'edition.c: In funzione 'int main (int, const char **)': edition.c: 4: Errore: sequenza di escape sconosciuta '\]' edition.c: 4: Errore : sequenza di escape sconosciuta '\]' edition.c edition.c ~ ' Nient'altro che un mucchio di errori di compilazione :( –

+0

Inoltre, la mia applicazione non dovrebbe dipendere da BASH. –

+0

@Koning: non dipende da BASH , funziona anche in altre shell (ma sono sicuro non tutte). Ho verificato in ksh e csh. Nota Ho modificato il codice di controllo per funzionare correttamente. – Stephen

11

Trattare con sequenze di colori può ottenere. sistemi disordinati e diversi possono utilizzare diversi indicatori sequenza di colori.

vorrei suggerire di provare a utilizzare ncurses. oltre a colore, ncurses possono fare molte altre cose ordinate con console UI.

+0

L'utilizzo di sequenze di colori differenti è dovuto al fatto che non riesco a trovare un file "colors.h" con tutto il lavoro svolto per me? –

6

È possibile assegnare un colore a ciascuna funzionalità per renderlo più utile.

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

Come saggia è possibile selezionare diversi codici colore e renderlo più generico.

1

Perché non è possibile stampare un personaggio con formattazione stringa. Si può anche pensare di aggiungere un formato con qualcosa di simile

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

f è formato in printf

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

stamperà blue bar

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

stamperà red 97

0

Se usi lo stesso colo r per l'intero programma, è possibile definire la funzione 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; 
    }