stdlib та кольоровий вихід у С


125

Я роблю просту програму, яка вимагає кольорового виводу. Як я можу зробити свій вихід кольоровим як emacs та bash?

Мене не хвилює Windows, оскільки моя програма призначена лише для систем UNIX.

Відповіді:


288

Всі сучасні емулятори терміналів використовують коди аварійних відхилень 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;
}

1
Але я припускаю, що я можу запустити bash в емуляції терміналу, яка не підтримує послідовності відходу ANSI.
ShinTakezou

Хороший прапор :) Просто ніт, що питання позначено тегом "c", а не "c ++"
Stephen

@ShinTakezou: Так .. У цьому випадку всі коди аварійних відхилень ANSI будуть ігноровані, і ви не матимете жодних варіантів зробити фантазійний вихід.
Андрейс Кайніков

14
Послідовності втечі ANSI не інтерпретуються оболонками, вони інтерпретуються термінальними емуляторами.
ніндзя

6
Особливо любив "не морочись з бібліотеками"! ANSI-коди працюють навіть у командному рядку Windows.
SzG

15

У роботі з кольоровими послідовностями можуть бути безладно, і різні системи можуть використовувати різні індикатори послідовності кольорів.

Я б запропонував спробувати використовувати ncurses . Крім кольорових, ncurses може робити багато інших акуратних речей з консольним інтерфейсом.


Чи використання різних кольорових послідовностей є причиною того, що я не можу знайти файл "color.h" з усією роботою, яка робиться для мене?
Прохолодний Джавелін

10

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

Наприклад:

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

РЕДАКТУВАННЯ: У моєму оригінальному використаний підказки кольорів підказки, який не працює :( Цей (я тестував).


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~Не більше, ніж купа помилок компіляції :(

Також моя заява не повинна залежати від BASH.

@Koning: Це не залежить від BASH, він працює і в інших оболонках (але я впевнений, що не всі). Я перевірив у ksh та csh. Примітка. Я відредагував керуючий код для нормальної роботи
Стівен

2
Не буде. Це залежить від термінальної емуляції. Якщо ANSI розуміє послідовності втечі ANSI, то ви матимете свої кольори, жирний шрифт або будь-який інший.
ShinTakezou

@Stephen Bonus: Змініть 22, 1щоб побачити його жирним шрифтом .
xxx ---

9

Ви можете призначити один колір кожному функціоналу, щоб зробити його кориснішим.

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

Як і мудрі, ви можете вибрати різні кольорові коди і зробити це більш загальним.


3

Якщо ви використовуєте один і той же колір для всієї програми, ви можете визначити 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;
   }

2

Тому що ви не можете надрукувати символ із форматированием рядків. Ви також можете подумати над тим, щоб додати формат із чимось подібним

#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


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

читання Вікіпедії :

  • \ x1b [0m скидає всі атрибути
  • \ x1b [31м задає колір переднього плану червоним
  • \ x1b [44м встановив би фон синім кольором.
  • обидва: \ x1b [31; 44м
  • обидва, але перевернуті : \ x1b [31; 44; 7м
  • не забудьте після цього скинути \ x1b [0m ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.