如何在 printf 中区分格式说明符和字符

4

这个问题的另一种表达方式可能是“如何在printf中结束格式说明符”

如果我想要以这种格式 100us 输出微秒,可以使用以下代码...

long microseconds = 100L;
printf("%lus", microseconds);

只打印了100s,因为u%l结合在一起,它将格式说明符解释为unsigned long而不是long


7
%l 本身并不是一个完整的格式规范。它可能会在某些 C 库中意外地运行,但依赖这一点是不正确的。始终给出完整的格式规范(在此情况下应使用 %ld),就不会遇到这个问题。 - zwol
@zwol啊,发布后注意到了。问题更多地是普遍存在的,因为我相信其他情况也可能发生冲突。我会尝试找一个不同的例子。 - baconcheese113
1
通用情况的答案是相同的:所有转换规范必须以“转换规范符”字符之一结尾(综合列表在此处:http://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p8)。如果您始终确保这样做,就不会与后续文本发生冲突。此外,如果您不始终这样做,`printf`可能会崩溃或打印无意义的内容。当我使用真正的计算机时,我可以将其作为适当的答案。 - zwol
@zwol,我觉得我的困惑来自于没有意识到每个格式说明符都必须以单个转换说明符符号/字符结尾。然后还混淆了一些转换说明符和其他修饰符。感谢您帮助我澄清困惑! - baconcheese113
请注意,100L 中的 L 没有什么作用。 - chux - Reinstate Monica
2个回答

6

仅需编写代码

long microseconds = 100L;
printf("%ldus", microseconds);

请注意,您不能在没有转换说明符的情况下使用长度修饰符。

...或者 %lius - Gabriel Staples

1
如何在printf中将格式说明符与字符分开
如果分隔很重要:
long microseconds = 100L;
printf("%ld" "us", microseconds);

相邻的字符串字面量将被连接。以上代码等同于"%ldus"

// or maybe via macros
#DEFINE TIME_FMT "%ld"
#DEFINE TIME_SUFFIX "us"
...
printf(TIME_FMT TIME_SUFFIX, microseconds);

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