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.

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

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.


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).


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.


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

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


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 ...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.