使用 %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 代码的功能完全位于编译器中,而不是它生成的可执行文件中。
您需要编写自己的解析器。至少,您需要执行以下操作:
- 删除前导引号和尾随引号。
- 用字符 0x1B 替换四个字符序列
3
。
- 用字符 0x0A 替换两个字符序列
\n
。
脚注
- 假设终端理解这些 ANSI 转义序列。
所以我有一个字符串 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 代码的功能完全位于编译器中,而不是它生成的可执行文件中。
您需要编写自己的解析器。至少,您需要执行以下操作:
- 删除前导引号和尾随引号。
- 用字符 0x1B 替换四个字符序列
3
。 - 用字符 0x0A 替换两个字符序列
\n
。
脚注
- 假设终端理解这些 ANSI 转义序列。