output stdlib e colorato in C


125

Sto realizzando una semplice applicazione che richiede un output colorato. Come posso rendere il mio output colorato come emacs e bash?

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

Risposte:


288

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

Maggiori informazioni sono qui .

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

1
Ma suppongo di poter eseguire bash in un'emulazione terminale che non supporta i seqs di escape ANSI.
ShinTakezou,

Bella bandiera :) Solo un sospetto che la domanda sia taggata 'c', non 'c ++'
Stephen

@ShinTakezou: Sì. In questo caso tutti i codici di escape ANSI verranno ignorati e non avrai opzioni per creare un output elaborato.
Andrejs Cainikovs,

14
Le sequenze di escape ANSI non sono interpretate da shell, ma interpretate da emulatori terminali.
ninjalj,

6
Mi è piaciuto molto il "non preoccuparti delle biblioteche"! I codici ANSI funzionano anche nel prompt dei comandi di Windows.
SzG

15

La gestione delle sequenze di colori può diventare confusa e sistemi diversi potrebbero utilizzare diversi indicatori di sequenza di colori.

Ti suggerirei di provare a usare ncurses . Oltre al colore, ncurses può fare molte altre cose pulite con l'interfaccia utente della console.


L'uso di sequenze di colori diverse è il motivo per cui non riesco a trovare un file "colors.h" con tutto quel lavoro fatto per me?
Raffreddare Javelin il

10

Puoi ottenere speciali codici di controllo del colore per ottenere un output terminale colorato, ecco una buona risorsa su come stampare i colori .

Per esempio:

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

EDIT: Il mio originale utilizzava i codici colore di prompt, che non funziona :( Questo funziona (l'ho provato).


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~Nient'altro che un mucchio di errori di compilazione :(

Inoltre, la mia domanda non dovrebbe dipendere da BASH.

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

2
Non lo sarà. Dipende dall'emulazione terminale. Se ANSI comprende le sequenze di escape ANSI, avrai i tuoi colori, grassetto o altro.
ShinTakezou,

@Stephen Bonus: Cambiare 22da 1per vederlo in grassetto .
xxx ---

9

Puoi assegnare un colore a ogni 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 saggio, puoi selezionare diversi codici colore e renderlo più generico.


3

Se si utilizza lo stesso colore per l'intero programma, è possibile definire la printf()funzione.

   #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

Perché non puoi stampare un personaggio con formattazione di stringhe. Puoi anche pensare di aggiungere un formato con qualcosa del genere

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

f è formato come in printf

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

stamperà blue bar

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

stamperà 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;
}

leggendo Wikipedia :

  • \ x1b [0m reimposta tutti gli attributi
  • \ x1b [31m imposta il colore di primo piano su rosso
  • \ x1b [44m imposta lo sfondo in blu.
  • entrambi: \ x1b [31; 44m
  • entrambi ma invertiti : \ x1b [31; 44; 7m
  • ricorda di reimpostare in seguito \ x1b [0m ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.