web-dev-qa-db-fra.com

sortie standard et colorée en C

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

Je me fiche de Windows, mon application étant réservée aux systèmes UNIX.

119
user142019

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

Plus d'infos est 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;
}
274
Andrejs Cainikovs

La gestion des séquences de couleurs peut devenir compliqué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 . Autre que la couleur, ncurses peut faire beaucoup d'autres choses bien avec l'interface utilisateur de la console.

15
Aryabhatta

Vous pouvez générer des codes de contrôle des couleurs spéciaux pour obtenir une sortie couleur du terminal. Voici une bonne ressource sur comment imprimer des couleurs .

Par exemple:

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

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

9
Stephen

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 les rendre plus génériques.

8
Praveen S

Si vous utilisez la même couleur pour tout le programme, vous pouvez définir la fonction 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;
   }
3
alhelal
#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 Wikipedia :

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

Parce que vous ne pouvez pas imprimer un caractère avec le formatage de chaîne. Vous pouvez aussi 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 formaté comme dans printf

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

va imprimer blue bar

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

va imprimer red 97

2
baz