stdlib и цветной выход в C
Я делаю простое приложение, которое требует цветной вывод. Как я могу сделать свой вывод цветным, как emacs и bash?
Я не забочусь о Windows, так как мое приложение предназначено только для систем UNIX.
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 ...