【问题标题】:Can I change the text color through sprintf in C?我可以通过 C 中的 sprintf 更改文本颜色吗?
【发布时间】:2021-09-15 07:40:31
【问题描述】:

我是 C 新手,遇到了这段代码,让我很困惑:

sprintf(banner1, "\e[37╔═╗\e[37┌─┐\e[37┌┐┌\e[37┌─┐\e[37┌─┐\e[37┌─┐\e[37┌─┐\e[37m\r\n");
sprintf(banner2, "\e[37╠═╝\e[37├─┤\e[37│││\e[37│ ┬\e[37├─┤\e[37├┤\e[37 ├─┤\e[37m\r\n");
sprintf(banner3, "\e[37╩  \e[37┴ ┴┘\e[37└┘\e[37└─┘\e[37┴ ┴\e[37└─┘\e[37┴ ┴\e[37m\r\n");

我很困惑,因为我不知道 \e[37\r\n 是什么意思。我可以改变颜色吗?

【问题讨论】:

  • 也许您的终端不支持 ANSI 转义序列。您选择的其中一种语言似乎相关,您可以考虑删除其他两种语言,将更完整的minimal reproducible example 放在一起,并描述您运行它的环境。
  • \e[37m,如果在支持 ANSI 的终端上打印,将导致文本以白色打印(无论如何这是默认设置)。请注意,\e 是 C 中的一个特殊序列,它提供了启动 ANSI 转义序列所必需的转义字符 (ASCII 27)。但是,您似乎确实可能遇到了转录错误,因为每个\e[37 后面都应该跟一个m。要了解 ANSI 序列的工作原理,请在 Google 上搜索“ANSI Escape Sequences”。
  • \r\n 是回车和换行,移动到下一行的开头。一般来说,在C语言中,只打印\n就足够了,因为\r是自动添加的,但是包含它并没有什么坏处。

标签: c printf ansi-colors


【解决方案1】:

这看起来像是在尝试使用ANSI terminal color escapesUnicode box drawing characters 以大型、风格化、彩色的方式书写“PANGAEA”一词。我猜它是复古风格的 BBS 或 MUD 系统的一部分,旨在与 telnetssh 进行交互。它不起作用,因为写它的人犯了很多错误。这是一个经过修正的独立程序:

#include <stdio.h>

int main(void)
{
    printf("\e[31m╔═╗\e[32m┌─┐ \e[33m┌┐┌\e[34m┌─┐\e[35m┌─┐\e[36m┌─┐\e[37m┌─┐\e[0m\n");
    printf("\e[31m╠═╝\e[32m├─┤ \e[33m│││\e[34m│ ┬\e[35m├─┤\e[36m├┤ \e[37m├─┤\e[0m\n");
    printf("\e[31m╩  \e[32m┴ ┴┘\e[33m┘└┘\e[34m└─┘\e[35m┴ ┴\e[36m└─┘\e[37m┴ ┴\e[0m\n");
    return 0;
}

错误是:使用\r\n 而不是普通的\n,在每个转义序列的末尾省略m,以及实际字母中的一些拼写错误(缺少空格等) .

我故意将sprintf(bannerN, ... 更改为printf 以使其成为一个独立的程序而不是更大系统的片段,并更改了每个字母使用的实际颜色代码以使其成为一个更有趣的演示。当我在我的电脑上运行这个程序时,我得到这个输出:

只有当您的终端仿真器支持 ANSI 颜色转义和打印 UTF-8 而没有特殊仪式时,该程序才能在您的计算机上运行。现在大多数 Unix 风格的操作系统默认都支持。我不了解 Windows。

【讨论】:

  • @A_J_D_H 几乎可以肯定是的。我可以想到它不会的情况,但现在它们都很少见。如果它对您不起作用,请在 Ask Ubuntu 上发表一篇新文章,并告诉他们您正在使用哪个终端仿真器以及 locale 命令的 完整且未编辑 输出(不带参数运行)。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多