stdlib y salida de color en C

125

Estoy haciendo una aplicación simple que requiere resultados en color. ¿Cómo puedo hacer que mi salida sea de color como emacs y bash do?

No me importa Windows, ya que mi aplicación es solo para sistemas UNIX.

mdml
fuente

Respuestas:

288

Todos los emuladores de terminal modernos usan códigos de escape ANSI para mostrar colores y otras cosas.
No te molestes con las bibliotecas, el código es realmente simple.

Más información está aquí .

Ejemplo 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
fuente
1
Pero supongo que puedo ejecutar bash en una emulación de terminal que no admite las secuencias de escape ANSI.
ShinTakezou
Nice flag :) Solo un indicio de que la pregunta está etiquetada 'c', no 'c ++'
Stephen
@ShinTakezou: Sí. En este caso, se ignorarán todos los códigos de escape ANSI, y no tendrá opciones para hacer la salida elegante.
Andrejs Cainikovs
14
Las secuencias de escape ANSI no son interpretadas por shells, son interpretadas por emuladores de terminal.
ninjalj
66
Especialmente me encantó el "no te molestes con las bibliotecas"! Los códigos ANSI incluso funcionan en el símbolo del sistema de Windows.
SzG
15

El manejo de las secuencias de color puede ser complicado y diferentes sistemas pueden usar diferentes Indicadores de secuencia de color.

Te sugiero que intentes usar ncurses . Además del color, ncurses puede hacer muchas otras cosas interesantes con la interfaz de usuario de la consola.


fuente
¿El uso de diferentes secuencias de colores es la razón por la que no puedo encontrar un archivo "colors.h" con todo el trabajo realizado por mí?
Cool Javelin
10

Puede generar códigos de control de color especiales para obtener una salida de terminal de color, aquí hay un buen recurso sobre cómo imprimir colores .

Por ejemplo:

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

EDITAR: Mi original usaba códigos de color de solicitud, que no funciona :( Este sí (lo probé).

Stephen
fuente
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~Nada más que un montón de errores de compilación :(
Además, mi aplicación no debería depender de BASH.
@Koning: Esto no depende de BASH, también funciona en otros shells (pero estoy seguro de que no todos). Lo verifiqué en ksh y csh. Tenga en cuenta que edité el código de control para que funcione correctamente.
Stephen
2
No será Depende de la emulación terminal. Si ANSI entiende las secuencias de escape ANSI, entonces tendrá sus colores, negrita o lo que sea.
ShinTakezou
@Stephen Bono: Cambio 22por 1lo vea en negrita .
xxx ---
9

Puede asignar un color a cada funcionalidad para que sea más útil.

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

Del mismo modo, puede seleccionar diferentes códigos de color y hacer que esto sea más genérico.

Praveen S
fuente
3

Si usa el mismo color para todo el programa, puede definir la printf()función.

   #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
fuente
2

Porque no puedes imprimir un personaje con formateo de cadena. También puede pensar en agregar un formato con algo como esto

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

f es formato como en printf

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

imprimirá blue bar

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

imprimirá red 97

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

leyendo Wikipedia :

  • \ x1b [0m restablece todos los atributos
  • \ x1b [31m establece el color de primer plano en rojo
  • \ x1b [44m establecería el fondo en azul.
  • ambos : \ x1b [31; 44m
  • ambos pero a la inversa: \ x1b [31; 44; 7m
  • recuerde restablecer después \ x1b [0m ...
Ladon
fuente