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.