Standardausgabe und farbige Ausgabe in C.


125

Ich mache eine einfache Anwendung, die farbige Ausgabe erfordert. Wie kann ich meine Ausgabe farbig machen wie Emacs und Bash?

Windows interessiert mich nicht, da meine Anwendung nur für UNIX-Systeme ist.

Antworten:


288

Alle modernen Terminalemulatoren verwenden ANSI-Escape-Codes, um Farben und andere Dinge anzuzeigen.
Kümmere dich nicht um Bibliotheken, der Code ist wirklich einfach.

Weitere Infos gibt es hier .

Beispiel 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
Aber ich nehme an, ich kann Bash in einer Terminalemulation ausführen, die ANSI-Escape-Sequenzen nicht unterstützt.
ShinTakezou

Schöne Flagge :) Nur eine Kleinigkeit, dass die Frage mit 'c' markiert ist, nicht mit 'c ++'
Stephen

@ShinTakezou: Ja. In diesem Fall werden alle ANSI-Escape-Codes ignoriert, und Sie haben keine Optionen, um die ausgefallene Ausgabe vorzunehmen.
Andrejs Cainikovs

14
ANSI-Escape-Sequenzen werden nicht von Shells interpretiert, sondern von Terminal-Emulatoren.
Ninjalj

6
Besonders gefallen hat mir das "kümmere dich nicht um Bibliotheken"! ANSI-Codes funktionieren sogar in der Windows-Eingabeaufforderung.
SzG

15

Der Umgang mit Farbsequenzen kann unübersichtlich werden und verschiedene Systeme verwenden möglicherweise unterschiedliche Farbsequenzindikatoren.

Ich würde vorschlagen, dass Sie versuchen, ncurses zu verwenden . Abgesehen von der Farbe können ncurses mit der Benutzeroberfläche der Konsole viele andere nette Dinge tun.


Ist die Verwendung unterschiedlicher Farbsequenzen der Grund, warum ich keine "colours.h" -Datei mit all der Arbeit finden kann, die für mich erledigt wurde?
Cooler Speer

10

Sie können spezielle Farbsteuerungscodes ausgeben, um eine farbige Terminalausgabe zu erhalten. Hier finden Sie eine gute Ressource zum Drucken von Farben .

Beispielsweise:

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

BEARBEITEN: Mein Original verwendete sofortige Farbcodes, was nicht funktioniert :( Dieser funktioniert (ich habe es getestet).


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~Nichts weiter als eine Reihe von Kompilierungsfehlern :(

Außerdem sollte meine Bewerbung nicht von BASH abhängig sein.

@Koning: Dies ist nicht BASH-abhängig, es funktioniert auch in anderen Shells (aber ich bin sicher nicht alle). Ich habe in ksh und csh verifiziert. Hinweis Ich habe den Steuercode so bearbeitet, dass er ordnungsgemäß funktioniert.
Stephen

2
Es wird nicht sein. Dies hängt von der Terminalemulation ab. Wenn ANSI ANSI-Escape-Sequenzen versteht, haben Sie Ihre Farben, Fettdruck oder was auch immer.
ShinTakezou

@Stephen Bonus: Ändern 22von 1es in sehen fett .
xxx ---

9

Sie können jeder Funktionalität eine Farbe zuweisen, um sie nützlicher zu machen.

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

Ebenso können Sie verschiedene Farbcodes auswählen und diese allgemeiner gestalten.


3

Wenn Sie für das gesamte Programm dieselbe Farbe verwenden, können Sie die printf()Funktion definieren .

   #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

Weil Sie kein Zeichen mit Zeichenfolgenformatierung drucken können. Sie können auch daran denken, ein Format mit so etwas hinzuzufügen

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

f ist Format wie in printf

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

wird gedruckt blue bar

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

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

Wikipedia lesen :

  • \ x1b [0m setzt alle Attribute zurück
  • \ x1b [31m setzt die Vordergrundfarbe auf Rot
  • \ x1b [44m würde den Hintergrund auf blau setzen.
  • beide : \ x1b [31; 44m
  • beides aber umgekehrt: \ x1b [31; 44; 7m
  • Denken Sie daran, danach zurückzusetzen \ x1b [0m ...
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.