stdlibとCのカラー出力


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

ナイスフラグ:)質問に「c ++」ではなく「c」というタグが付けられているだけ
Stephen

@ShinTakezou:はい。この場合、ANSIエスケープコードはすべて無視され、ファンシーな出力を行うオプションはありません。
Andrejs Cainikovs

14
ANSIエスケープシーケンスはシェルでは解釈されず、ターミナルエミュレータで解釈されます。
ninjalj 2010

6
特に「ライブラリに煩わされない」を愛した!ANSIコードは、Windowsコマンドプロンプトでも機能します。
SzG 2015

15

カラーシーケンスの扱いは面倒になる可能性があり、異なるシステムでは異なるカラーシーケンスインジケーターを使用する場合があります。

ncursesを使用することをお勧めします。ncursesは、カラー以外にも、コンソールUIを使って他の多くのきちんとしたことを行うことができます。


さまざまなカラーシーケンスを使用しているので、「colors.h」ファイルが見つかりません。
クールジャベリン2018年

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

@Stephen ボーナス:太字で表示22される1ように変更してください。
xxx ---

9

すべての機能に1つの色を割り当てて、より便利にすることができます。

#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 [31mは前景色を赤に設定します
  • \ x1b [44mは背景を青に設定します。
  • 両方:\ x1b [31; 44m
  • 両方が逆です:\ x1b [31; 44; 7m
  • 後でリセットすることを忘れないでください\ x1b [0m ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.