stdlib e saída colorida em C

125

Estou fazendo um aplicativo simples que requer saída colorida. Como posso fazer minha saída colorida como emacs e bash?

Não me importo com o Windows, pois meu aplicativo é apenas para sistemas UNIX.

mdml
fonte

Respostas:

288

Todos os emuladores de terminal modernos usam códigos de escape ANSI para mostrar cores e outras coisas.
Não se preocupe com as bibliotecas, o código é realmente simples.

Mais informações estão aqui .

Exemplo em 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
fonte
1
Mas suponho que posso executar o bash em uma emulação de terminal que não oferece suporte a ANSI escape seqs.
ShinTakezou
Agradável bandeira :) Apenas um nit que a questão é marcado 'c', e não 'c ++'
Stephen
@ShinTakezou: Sim. Nesse caso, todos os códigos de escape ANSI serão ignorados e você não terá opções para obter uma saída sofisticada.
Andrejs Cainikovs
14
As seqüências de escape ANSI não são interpretadas por shells, elas são interpretadas por emuladores de terminal.
Njalj
6
Especialmente amei o "não se preocupe com as bibliotecas"! Os códigos ANSI até funcionam no prompt de comando do Windows.
Szg
15

Lidar com seqüências de cores pode ficar confuso e sistemas diferentes podem usar indicadores de sequência de cores diferentes.

Eu sugiro que você tente usar ncurses . Além da cor, as ncurses podem fazer muitas outras coisas legais com a interface do usuário do console.


fonte
O uso de seqüências de cores diferentes é o motivo pelo qual não consigo encontrar um arquivo "colors.h" com todo esse trabalho feito para mim?
Arrefecer Javelin
10

Você pode imprimir códigos especiais de controle de cores para obter uma saída de terminal colorida. Aqui está um bom recurso sobre como imprimir cores .

Por exemplo:

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

EDIT: Meu original usou códigos de cores de prompt, o que não funciona :( Este funciona (eu testei).

Stephen
fonte
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 mais que um monte de erros de compilação :(
Além disso, meu aplicativo não deve depender do BASH.
@ Koning: Isso não depende do BASH, ele também funciona em outras conchas (mas tenho certeza de que não todas). Eu verifiquei em ksh e csh. Nota: editei o código de controle para funcionar corretamente.
Stephen
2
Não será. Depende da emulação do terminal. Se o ANSI entender as seqüências de escape do ANSI, você terá suas cores, negrito ou o que for.
ShinTakezou
@Stephen Bonus: Mudança 22por 1vê-lo em negrito .
xxx ---
9

Você pode atribuir uma cor a cada funcionalidade para torná-la mais ú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");
}

Da mesma forma, você pode selecionar códigos de cores diferentes e tornar isso mais genérico.

Praveen S
fonte
3

Se você usar a mesma cor para todo o programa, poderá definir a printf()função.

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

Porque você não pode imprimir um caractere com formatação de string. Você também pode adicionar um formato com algo como isto

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

f é o formato como em printf

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

irá imprimir blue bar

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

irá imprimir red 97

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

lendo a Wikipedia :

  • \ x1b [0m redefine todos os atributos
  • \ x1b [31m define a cor do primeiro plano como vermelho
  • \ x1b [44m definiria o plano de fundo para azul.
  • ambos: \ x1b [31; 44m
  • ambos, mas invertidos: \ x1b [31; 44; 7m
  • lembre-se de redefinir depois \ x1b [0m ...
Ladon
fonte