使用 %s 在 printf 中保留格式

Retain formatting in printf with %s

所以我有一个字符串 char *str = someString();,我想打印该字符串并保留字符串中可能存在的任何格式 printf("%s", str); 例如,如果 str 是等于 "3[32mPassed!\n3[0m",我希望它以绿色打印 Passed!,然后换行。但目前,它按字面打印字符串。 这是 printf 可以做的还是不是为此设计的?我知道如果字符串包含 %d 之类的内容而实际上没有传递数字,这可能会导致问题。

␛[32mPassed!␊␛[0m 发送到终端是产生预期效果的原因。[1]

您问的是如何将字符串 "3[32mPassed!\n3[0m" 转换为字符串 ␛[32mPassed!␊␛[0m,就像 C 编译器在提供 C 代码(C 字符串文字)时所做的那样 "3[32mPassed!\n3[0m".

printf 不提供将 C 字符串文字转换为它会生成的字符串的方法。

而且标准库中的其他任何东西都没有。解析 C 代码的功能完全位于编译器中,而不是它生成的可执行文件中。

您需要编写自己的解析器。至少,您需要执行以下操作:

  1. 删除前导引号和尾随引号。
  2. 用字符 0x1B 替换四个字符序列 3
  3. 用字符 0x0A 替换两个字符序列 \n

脚注

  1. 假设终端理解这些 ANSI 转义序列。