stdlib et sortie colorée en C

125

Je fais une application simple qui nécessite une sortie colorée. Comment puis-je rendre ma sortie colorée comme le font emacs et bash?

Je me fiche de Windows, car mon application est uniquement destinée aux systèmes UNIX.

mdml
la source

Réponses:

288

Tous les émulateurs de terminal modernes utilisent des codes d'échappement ANSI pour afficher les couleurs et d'autres choses.
Ne vous embêtez pas avec les bibliothèques, le code est vraiment simple.

Plus d'informations ici .

Exemple en 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
la source
1
Mais je suppose que je peux exécuter bash dans une émulation de terminal qui ne prend pas en charge les séquences d'échappement ANSI.
ShinTakezou
Joli drapeau :) Juste un peu que la question est étiquetée «c», pas «c ++»
Stephen
@ShinTakezou: Oui .. Dans ce cas, tous les codes d'échappement ANSI seront ignorés et vous n'aurez aucune option pour faire la sortie fantaisie.
Andrejs Cainikovs
14
Les séquences d'échappement ANSI ne sont pas interprétées par des shells, elles sont interprétées par des émulateurs de terminaux.
ninjalj
6
J'ai particulièrement aimé le "ne vous embêtez pas avec les bibliothèques"! Les codes ANSI fonctionnent même dans l'invite de commande Windows.
SzG
15

La gestion des séquences de couleurs peut devenir désordonnée et différents systèmes peuvent utiliser différents indicateurs de séquence de couleurs.

Je vous suggère d'essayer d'utiliser ncurses . Outre la couleur, ncurses peut faire beaucoup d'autres choses intéressantes avec l'interface utilisateur de la console.


la source
Est-ce que l'utilisation de séquences de couleurs différentes est la raison pour laquelle je ne trouve pas de fichier "colors.h" avec tout ce travail fait pour moi?
Cool Javelin
10

Vous pouvez générer des codes de contrôle de couleur spéciaux pour obtenir une sortie de terminal colorée, voici une bonne ressource sur la façon d'imprimer les couleurs .

Par exemple:

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

EDIT: Mon original utilisait des codes de couleur d'invite, ce qui ne fonctionne pas: (Celui-ci le fait (je l'ai testé).

Stephen
la source
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~Rien de plus qu'un tas d'erreurs de compilation :(
De plus, mon application ne doit pas dépendre de BASH.
@Koning: Cela ne dépend pas de BASH, cela fonctionne aussi dans d'autres shells (mais je suis sûr que pas tous). J'ai vérifié dans ksh et csh. Remarque J'ai modifié le code de contrôle pour qu'il fonctionne correctement.
Stephen
2
Ce ne sera pas le cas. Cela dépend de l'émulation du terminal. Si c'est ANSI qui comprend les séquences d'échappement ANSI, alors vous aurez vos couleurs, en gras ou autre.
ShinTakezou
@Stephen Bonus: changez 22par 1pour le voir en gras .
xxx ---
9

Vous pouvez attribuer une couleur à chaque fonctionnalité pour la rendre plus 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");
}

De même, vous pouvez sélectionner différents codes de couleur et rendre cela plus générique.

Praveen S
la source
3

Si vous utilisez la même couleur pour l'ensemble du programme, vous pouvez définir la printf()fonction.

   #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
la source
2

Parce que vous ne pouvez pas imprimer un caractère avec un formatage de chaîne. Vous pouvez également penser à ajouter un format avec quelque chose comme ça

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

f est le format comme dans printf

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

va imprimer blue bar

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

va imprimer red 97

baz
la source
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;
}

lecture de Wikipedia :

  • \ x1b [0 m réinitialise tous les attributs
  • \ x1b [31 m définit la couleur de premier plan sur le rouge
  • \ x1b [44 m définirait l'arrière-plan en bleu.
  • tous les deux : \ x1b [31; 44m
  • les deux mais inversés: \ x1b [31; 44; 7m
  • n'oubliez pas de réinitialiser ensuite \ x1b [0m ...
Ladon
la source