stdlib и цветной вывод в C

Я делаю простое приложение, которое требует цветного вывода. Как я могу сделать свой вывод цветным, как это делают emacs и bash?

Меня не волнует Windows, так как мое приложение предназначено только для систем UNIX.


person Community    schedule 10.07.2010    source источник


Ответы (7)


Все современные эмуляторы терминала используют escape-коды ANSI для отображения цветов и других вещей.
Не беспокойтесь о библиотеках, код очень прост.

Дополнительная информация находится здесь.

Пример на С:

#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;
}
person Andrejs Cainikovs    schedule 10.07.2010
comment
Но я полагаю, что могу запустить bash в эмуляции терминала, которая не поддерживает управляющие последовательности ANSI. - person ShinTakezou; 10.07.2010
comment
Хороший флаг :) Просто гнида, что вопрос помечен как 'c', а не 'c++' - person Stephen; 10.07.2010
comment
@ShinTakezou: Да .. В этом случае все escape-коды ANSI будут игнорироваться, и у вас не будет возможности сделать причудливый вывод. - person Andrejs Cainikovs; 10.07.2010
comment
Управляющие последовательности ANSI не интерпретируются оболочками, они интерпретируются эмуляторами терминала. - person ninjalj; 10.07.2010
comment
Будет ли это работать в xterm? Что произойдет, если я изменю настройки терминала и запущу этот код? Кажется довольно глупым делать свой собственный терминал, когда вам это не нужно. Во всяком случае, вполне может быть достаточно хорошо для OP. - person ; 10.07.2010
comment
@Andrejs: я знаю, как это работает. Я утверждаю, что этот подход недостаточно переносим и очень ограничителен (работает только с терминалами, совместимыми с ANSI). То, что код «простой», не означает, что вы должны его использовать. Добавьте еще несколько терминалов для поддержки, и код станет сложным и трудным для поддержки. Лучше всего использовать уже имеющуюся библиотеку. На самом деле, даже с ANSI CSI может различаться между терминалами, поэтому он может даже не работать на всех терминалах, совместимых с ANSI (хотя и не уверен в этом). - person ; 11.07.2010
comment
@Moron: я думал, что настоящий CSI (0x9b) не распознается некоторыми эмуляторами терминала, но любой нормальный эмулятор терминала, совместимый с ANSI/ECMA-48, распознает 7-битный CSI (ESC [)? - person ninjalj; 13.07.2010
comment
@ninjalj: Возможно, но, как я уже сказал, я не очень уверен. - person ; 13.07.2010
comment
Особенно понравилось не заморачиваться с библиотеками! Коды ANSI работают даже в командной строке Windows. - person SzG; 22.12.2015

Работа с последовательностями цветов может запутаться, и разные системы могут использовать разные индикаторы последовательности цветов.

Я бы посоветовал вам попробовать использовать ncurses. Помимо цвета, ncurses может делать много других полезных вещей с пользовательским интерфейсом консоли.

person Community    schedule 10.07.2010
comment
Является ли использование различных последовательностей цветов причиной того, что я не могу найти файл colors.h со всей проделанной за меня работой? - person Cool Javelin; 27.01.2018

Вы можете вывести специальные коды управления цветом, чтобы получить цветной вывод терминала, вот хороший ресурс на как печатать цвета.

Например:

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

РЕДАКТИРОВАТЬ: Мой оригинальный использовал цветовые коды подсказок, которые не работают :( Этот работает (я проверял).

person Stephen    schedule 10.07.2010
comment
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~ Не более чем куча ошибок компиляции :( - person ; 10.07.2010
comment
Кроме того, мое приложение не должно зависеть от BASH. - person ; 10.07.2010
comment
@Koning: это не зависит от BASH, оно работает и в других оболочках (но я уверен, что не во всех). Я проверил в ksh и csh. Примечание. Я отредактировал управляющий код, чтобы он работал правильно. - person Stephen; 10.07.2010
comment
Этого не будет. Это зависит от эмуляции терминала. Если ANSI понимает escape-последовательности ANSI, тогда у вас будут свои цвета, жирный шрифт или что-то еще. - person ShinTakezou; 10.07.2010
comment
@Stephen Бонус: замените 22 на 1, чтобы выделить его полужирным шрифтом. - person hola; 31.07.2014

Вы можете назначить один цвет для каждой функции, чтобы сделать ее более полезной.

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

Точно так же вы можете выбрать разные цветовые коды и сделать их более общими.

person Praveen S    schedule 10.07.2010

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

чтение Википедии:

  • \x1b[0m сбрасывает все атрибуты
  • \x1b[31m устанавливает красный цвет переднего плана
  • \x1b[44m сделает фон синим.
  • оба : \x1b[31;44m
  • оба, но наоборот: \x1b[31;44;7m
  • не забудьте потом сбросить \x1b[0m ...
person Veles    schedule 21.08.2018

Потому что вы не можете напечатать символ с форматированием строки. Вы также можете подумать о добавлении формата с чем-то вроде этого

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

f это формат как в printf

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

напечатает blue bar

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

напечатает red 97

person baz    schedule 04.06.2016

Если вы используете один и тот же цвет для всей программы, вы можете определить функцию 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;
   }
person alhelal    schedule 01.02.2017