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


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

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

7 94

7 ответов:

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

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

например, в 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;
}

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

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

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

например:

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

EDIT: мой оригинал использовал быстрые цветовые коды, которые не работают: (Этот делает (я его тестировал).

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

#define Color_Red "[0:31m\]" // Color Start
#define Color_end "[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");
}

Как мудро вы можете выбрать различные цветовые коды и сделать это более универсальным.

Если вы используете один и тот же цвет для всей программы , вы можете определить

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

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

f - это формат, в printf

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

печати blue bar

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

печати red 97

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