如何以跨平台的方式在控制台中打印彩色文本?

34

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

3个回答

35

您可以使用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;
}

27 是表示转义字符的数字代码。如果您喜欢,可以使用 \e

各种网站都有完整的代码列表。 这里 就是其中之一。


1
假设使用 ANSI 转义序列,这是由 VT100 衍生出来的流行方式(VT1xx 没有颜色)。你可以使用 "\033" 代替 "%c", 27 - ephemient
@ephemient,甚至在我的机器上\e也可以工作。OS X的终端和大多数Linux控制台应用程序都支持ANSI转义序列,因此我认为它满足了他的问题。 - Carl Norum
如果我没记错的话,\e 是仅限于gcc的。 - Jack
1
有没有可能给新手更详细地解释一下这里发生了什么?printf文档中似乎没有关于此的说明。是什么导致这种语法以这种方式工作的?只是好奇想更好地理解它!谢谢 :) - Hendeca
@Hendeca,这是因为它与printf无关。终端程序本身会将这些转义码解释为命令,以更改其在屏幕上使用的颜色。 - Carl Norum

6
另一个选项是:
# 首先定义一些颜色(可以将其放在您的.bashrc文件中):
red='\e[0;31m'
RED='\e[1;31m'
blue='\e[0;34m'
BLUE='\e[1;34m'
cyan='\e[0;36m'
CYAN='\e[1;36m'
green='\e[0;32m'
GREEN='\e[1;32m'
yellow='\e[0;33m'
YELLOW='\e[1;33m'
NC='\e[0m'
#################

然后在终端中输入:

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

不要忘记在末尾加上 ${NC}。NC 代表“无颜色”,这意味着在您的句子之后,它会恢复到正常颜色。如果您忘记了它,整个提示和随后的命令都将是您指定的颜色(当然,您可以键入 'echo -e "${NS}"' 来改变它回来)。


这似乎在Mac(OS X v10.9.1)的终端上无法工作 - 我没有将它放在.bashrc中,只是在命令行上的shell中定义了它 - 但文本直接被打印出来了。 - Anand
1
问题是关于 'printf' 命令,而不是终端命令。此外,还要求跨平台解决方案,'把这个放到你的 .bashrc 文件中' 并不是。 - TimZaman
@TimZaman 嗯,从技术上讲,OP要求在Mac OS X和Linux上提供解决方案,因此将其放在.bashrc中正是如此。尽管我同意这并没有回答如何使用“printf”来完成它。我确实感到有必要指出,我给出了我的答案作为另一种选择:“另一个选项是:”,而不是声明这实际上是答案。 - lugte098

2

为了最佳的可移植性,请查询terminfo数据库。在shell中,

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的库等效物 - 或许直接从开源中提取? - kfmfe04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接