C의 stdlib 및 컬러 출력


125

컬러 출력이 필요한 간단한 응용 프로그램을 만들고 있습니다. 내 출력을 emacs 및 bash처럼 색상으로 만들려면 어떻게해야합니까?

내 응용 프로그램은 UNIX 시스템 전용이므로 Windows는 신경 쓰지 않습니다.

답변:


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
하지만 ANSI 이스케이프 시퀀스를 지원하지 않는 터미널 에뮬레이션에서 bash를 실행할 수 있다고 가정합니다.
ShinTakezou 2010

Nice flag :) 질문에 'c ++'가 아닌 'c'태그가 붙은 nit
Stephen

@ShinTakezou : 예 ..이 경우 모든 ANSI 이스케이프 코드가 무시되고 멋진 출력을 만들 수있는 옵션이 없습니다.
Andrejs Cainikovs

14
ANSI 이스케이프 시퀀스는 셸에서 해석되지 않고 터미널 에뮬레이터에서 해석됩니다.
ninjalj 2010

6
특히 "도서관에 신경 쓰지 마십시오"를 좋아했습니다! ANSI 코드는 Windows 명령 프롬프트에서도 작동합니다.
SzG

15

색상 시퀀스를 다루는 것은 지저분해질 수 있으며 다른 시스템은 다른 색상 시퀀스 표시기를 사용할 수 있습니다.

ncurses를 사용하는 것이 좋습니다 . 색상 외에도 ncurses는 콘솔 UI로 다른 많은 깔끔한 작업을 수행 할 수 있습니다.


다른 색상 시퀀스를 사용하는 것이 저를 위해 모든 작업을 수행 한 "colors.h"파일을 찾을 수없는 이유입니까?
Cool Javelin

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에서 확인했습니다. 참고 제대로 작동하도록 제어 코드를 편집했습니다.
Stephen

2
그렇지 않습니다. 터미널 에뮬레이션에 따라 다릅니다. ANSI가 ANSI 이스케이프 시퀀스를 이해하는 경우 색상, 굵게 또는 무엇이든 사용할 수 있습니다.
ShinTakezou 2010

@Stephen 보너스 : 변경 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;
}

Wikipedia 읽기 :

  • \ x1b [0m은 모든 속성을 재설정합니다.
  • \ x1b [31m 전경색을 빨간색으로 설정
  • \ x1b [44m 은 배경을 파란색으로 설정합니다.
  • 둘 다 : \ x1b [31; 44m
  • 둘 다 반전 : \ x1b [31; 44; 7m
  • 나중에 재설정하는 것을 잊지 마십시오 \ x1b [0m ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.