C中的stdlib和彩色输出


125

我正在制作一个需要彩色输出的简单应用程序。如何使输出的颜色像emacs和bash一样?

我不在乎Windows,因为我的应用程序仅适用于UNIX系统。

Answers:


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年

不错的标志:)只是这个问题被标记为“ c”,而不是“ c ++”
斯蒂芬

@ShinTakezou:是的。在这种情况下,所有ANSI转义码都将被忽略,并且您将没有任何选择来制作精美的输出。
Andrejs Cainikovs 2010年

14
外壳不解释ANSI转义序列,而是由终端仿真器解释。
ninjalj 2010年

6
特别喜欢“不用去图书馆”!ANSI代码甚至可以在Windows命令提示符下使用。
SzG 2015年

15

处理颜色序列可能会变得混乱,并且不同的系统可能会使用不同的颜色序列指示器。

我建议您尝试使用ncurses。除颜色外,ncurses还可通过控制台UI进行许多其他整洁的事情。


使用不同的颜色顺序是无法找到为我完成所有工作的“ colors.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无关,它也可以在其他shell中工作(但我确定不是全部)。我在ksh和csh中验证过。注意我编辑了控制代码以使其正常工作。
斯蒂芬

2
不会的 这取决于终端仿真。如果是ANSI理解ANSI转义序列,那么您将拥有颜色,粗体或其他颜色。
ShinTakezou,2010年

@Stephen Bonus:更改221粗体显示
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 [31m将前景色设置为红色
  • \ x1b [44m会将背景设置为蓝色。
  • 都:\ x1b [31; 44m
  • 两者都相反:\ x1b [31; 44; 7m
  • 记得之后再重置\ x1b [0m ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.