147

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

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

4

7 回答 7

335

所有现代终端仿真器都使用 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;
}
于 2010-07-10T14:04:16.567 回答
15

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

我建议您尝试使用ncurses。除了颜色之外,ncurses 还可以通过控制台 UI 完成许多其他简洁的事情。

于 2010-07-10T13:50:02.463 回答
10

您可以输出特殊的颜色控制代码来获得彩色终端输出,这是关于如何打印颜色的一个很好的资源。

例如:

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

编辑:我原来的一个使用提示颜色代码,它不起作用:(这个可以(我测试过)。

于 2010-07-10T13:42:20.390 回答
10

您可以为每个功能分配一种颜色以使其更有用。

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

同样,您可以选择不同的颜色代码并使其更通用。

于 2010-07-10T14:00:58.737 回答
6
#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
  • both but inversed : \x1b[31;44;7m
  • remember to reset afterwards \x1b[0m ...
于 2018-08-21T11:06:20.047 回答
3

因为您无法使用字符串格式打印字符。您还可以考虑添加类似这样的格式

#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

于 2016-06-04T03:09:37.367 回答
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;
   }
于 2017-02-01T17:17:45.260 回答