C语言 stdlib和彩色输出

n9vozmp4  于 2023-03-07  发布在  其他
关注(0)|答案(8)|浏览(131)

我正在做一个需要彩色输出的简单应用程序。我怎样才能像emacs和bash那样使我的输出彩色呢?
我不关心Windows,因为我的应用程序只适用于UNIX系统。

fae0ux8s

fae0ux8s1#

所有现代的终端仿真器都使用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;
}
nkcskrwz

nkcskrwz2#

处理颜色序列可能会变得混乱,不同的系统可能会使用不同的颜色序列指示器。
我建议您尝试使用ncurses。除了颜色,ncurses还可以使用控制台UI做许多其他整洁的事情。

px9o7tmv

px9o7tmv3#

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

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

像明智的,你可以选择不同的颜色代码,使这更通用。

9fkzdhlc

9fkzdhlc4#

您可以输出特殊的颜色控制代码来获得彩色终端输出,这里有一个关于how to print colors的很好的资源。
例如:

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

编辑:我原来的一个使用提示颜色代码,这是行不通的:(这一个(我测试过)。

uajslkp6

uajslkp65#

#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[0 m * 重置所有属性
  • *\x1b[31 m * 将前景色设置为红色
  • *\x1b[44 m * 将背景设置为蓝色。
  • 两者:*\x1b [31;4千4百万 *
  • 两者相反:* [31;44;7百万 *
  • 记得稍后重置 *\x1b[0 m *...
fhg3lkii

fhg3lkii6#

如果整个程序使用相同的颜色,可以定义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;
   }
cuxqih21

cuxqih217#

因为你不能用字符串格式来打印字符,你也可以考虑用这样的方式来添加一个格式

#define PRINTC(c,f,s) printf ("\033[%dm" f "\033[0m", 30 + c, s)

fprintf相同

PRINTC (4, "%s\n", "bar")

将打印blue bar

PRINTC (1, "%d", 'a')

将打印red 97

9gm1akwq

9gm1akwq8#

扩展@AndrejsCainikovs的答案,下面是一段代码,它适用于24位rgb代码(字体和背景颜色都适用),终端支持这样的代码(Xterm、KDE的Konsole和iTerm,以及所有基于libvte的终端,包括GNOME终端,参见https://en.wikipedia.org/wiki/ANSI_escape_code#Colors):

#include <stdio.h>

#define ANSI_FONT_COL_RESET     "\x1b[0m"
#define FONT_COL_CUSTOM_RED     "\e[38;2;200;0;0m" // where rrr;ggg;bbb in 38;2;rrr;ggg;bbbm can go from 0 to 255 respectively
#define FONT_COL_CUSTOM_GREEN   "\e[38;2;0;200;0m" // where rrr;ggg;bbb in 38;2;rrr;ggg;bbbm can go from 0 to 255 respectively
#define FONT_COL_CUSTOM_BLUE    "\e[38;2;0;0;200m" // where rrr;ggg;bbb in 38;2;rrr;ggg;bbbm can go from 0 to 255 respectively
#define BCKGRD_COL_CUSTOM_RED   "\e[48;2;200;0;0m" // where rrr;ggg;bbb in 48;2;rrr;ggg;bbbm can go from 0 to 255 respectively
#define BCKGRD_COL_CUSTOM_GREEN "\e[48;2;0;200;0m" // where rrr;ggg;bbb in 48;2;rrr;ggg;bbbm can go from 0 to 255 respectively
#define BCKGRD_COL_CUSTOM_BLUE  "\e[48;2;0;0;200m" // where rrr;ggg;bbb in 48;2;rrr;ggg;bbbm can go from 0 to 255 respectively

int main (int argc, char const *argv[]) {

  printf(FONT_COL_CUSTOM_RED     "This font color is CUSTOM_RED!"           ANSI_FONT_COL_RESET "\n");
  printf(FONT_COL_CUSTOM_GREEN   "This font color is CUSTOM_GREEN!"         ANSI_FONT_COL_RESET "\n");
  printf(FONT_COL_CUSTOM_BLUE    "This font color is CUSTOM_BLUE!"          ANSI_FONT_COL_RESET "\n");
  printf(BCKGRD_COL_CUSTOM_RED   "This background color is CUSTOM_RED!"     ANSI_FONT_COL_RESET "\n");
  printf(BCKGRD_COL_CUSTOM_GREEN "This background color is CUSTOM_GREEN!"   ANSI_FONT_COL_RESET "\n");
  printf(BCKGRD_COL_CUSTOM_BLUE  "This background color is CUSTOM_BLUE!"    ANSI_FONT_COL_RESET "\n");
  printf(FONT_COL_CUSTOM_GREEN BCKGRD_COL_CUSTOM_RED "This font color is CUSTOM_GREEN with background CUSTOM_RED!"    ANSI_FONT_COL_RESET "\n");
  printf(                        "This font color is NORMAL!\n");

  return 0;
}

相关问题