2010-07-10 3 views
87

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

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

ответ

217

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

Дополнительная информация here.

Пример в 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; 
} 
+0

Nice wiki ссылка для цветовых кодов. –

+1

Но я полагаю, что могу запустить bash в эмуляции терминала, которая не поддерживает escape-последовательности ANSI. – ShinTakezou

+0

Хороший флаг :) Просто нить, что вопрос помечен как «c», а не «C++» – Stephen

7

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

Например:

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

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

+0

'edition.c: В функции 'Int основной (междунар, Const символ **)': edition.c: 4: ошибка: неизвестная последовательность '\]' edition.c: 4: ошибка : неизвестная escape-последовательность '\]' edition.c edition.c ~ ' Не более, чем куча ошибок компиляции :( – 2010-07-10 13:45:40

+0

Кроме того, мое приложение не должно зависеть от BASH. – 2010-07-10 13:46:16

+0

@Koning: Это не зависит от BASH , он работает и в других оболочках (но я уверен, что не все). Я проверял в ksh и csh. Примечание. Я отредактировал код управления для правильной работы. – Stephen

11

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

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

+0

Использует разные цветовые последовательности, потому что я не могу найти файл colors.h со всей этой работой для меня? –

6

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

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

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

1

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

#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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^