【问题标题】:How can I print to the console in color in a cross-platform manner?如何以跨平台的方式以彩色打印到控制台?
【发布时间】:2011-01-22 03:28:21
【问题描述】:

如何在 Mac OS X 和 Linux 上使用“printf”输出彩色文本?

【问题讨论】:

    标签: linux macos console colors


    【解决方案1】:

    您可以使用 ANSI 颜色代码。这是一个示例程序:

    #include <stdio.h>
        
    int main(int argc, char *argv[])
    {
      printf("%c[1;31mHello, world!\n", 27); // red
      printf("%c[1;32mHello, world!\n", 27); // green
      printf("%c[1;33mHello, world!\n", 27); // yellow
      printf("%c[1;34mHello, world!\n", 27); // blue
      return 0;
    }
    

    27escape 字符。如果您愿意,可以使用\e

    网络上有所有代码的列表。 Here is one.

    【讨论】:

    • 假设 ANSI 转义序列,由 VT100 衍生产品推广(VT1xx 没有颜色)。你可以使用"\033" 而不是"%c", 27
    • @ephemient,甚至 \e 在我的机器上工作。 OS X 的终端和大多数 linux 控制台应用程序都支持 ANSI 转义序列,所以我认为它满足了他的问题。
    • 如果我没记错的话,\e 是 gcc-only。
    • 你有没有机会更详细地解释一下新手在这里发生了什么? printf 文档中似乎没有关于它的内容。是什么导致这种语法以这种方式工作?只是想更好地理解它!谢谢你:)
    • @Hendeca,那是因为它与printf 无关。是终端程序本身将这些转义码解释为更改其在屏幕上使用的颜色的命令。
    【解决方案2】:

    另一种选择是:

    # 首先定义一些颜色(你可以把它放在你的 .bashrc 文件中): 红色='\e[0;31m' 红='\e[1;31m' 蓝色='\e[0;34m' 蓝色='\e[1;34m' 青色='\e[0;36m' 青色='\e[1;36m' 绿色='\e[0;32m' 绿色='\e[1;32m' 黄色='\e[0;33m' 黄色='\e[1;33m' NC='\e[0m' #################

    然后你可以在终端输入:

    echo -e "${RED}这是一个错误${NC}" echo -e "${YELLOW}这是一个警告${NC}" echo -e "${GREEN}一切正常!${NC}"

    不要忘记最后的 ${NC}。 NC 代表“no color”,意思是说完你的句子后,它会恢复到正常颜色。如果你忘记了,之后的整个提示和命令将采用你指定的颜色(当然你可以输入 'echo -e "${NS}"' 将其改回)。

    【讨论】:

    • 这似乎在 mac (OS X v10.9.1) 上的终端中不起作用——我没有把它放在 .bashrc 中,只是在命令行的 shell 中定义了它——但是文本是直接打印出来的。
    • 问题是关于“printf”命令,而不是终端命令。此外,还请求了一个跨平台解决方案,“把它放在你的 .bashrc 中”不是那样的。
    • @TimZaman 好吧,从技术上讲,OP 要求“在 Mac OS X 和 Linux 上”的解决方案,所以将它放在 .bashrc 中就是这样。虽然我同意它没有回答如何使用“printf”来做到这一点。我确实觉得有必要指出我给出了我的答案作为替代:“另一种选择是:”,而不是说这实际上是答案。
    【解决方案3】:

    为获得最佳可移植性,请查询terminfo 数据库。在外壳中,

    colors=(black red green yellow blue magenta cyan white)
    for ((i = 0; i < ${#colors[*]}; i++)); do
        ((j=(i+1)%${#colors[*]}))
        printf '%s%s%s on %s%s\n' "$(tput setaf $i)" "$(tput setab $j)" \
                "${colors[i]}" "${colors[j]}" "$(tput op)"
    done
    

    会打印出来

    红底黑字 绿底红字 黄底绿 蓝底黄 洋红色上的蓝色 青色上的洋红色 白底青色 黑底白字

    但有颜色。

    【讨论】:

    • +1 不错,但是我如何从 C 中做到这一点?我似乎找不到 tput 的等效库 - 也许直接从开源中提取它?
    猜你喜欢
    • 2015-01-31
    • 2010-10-28
    • 1970-01-01
    • 2020-02-15
    • 2011-04-11
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多