【发布时间】:2026-01-20 01:00:01
【问题描述】:
fprintf() 系列函数有 5 个 标志 个字符 '-'、'+'、' '、'#'、'0'。
当一个标志重复时,指定的行为是什么?
#include <stdio.h>
int main(void) {
printf("% d\n", 12); // 12
printf("%00d\n", 34); // 34
printf("%++d\n", 56); // +56
printf("%00*d\n", 5, 78); // 00078
return 0;
}
使用我的 gcc“i686-pc-cygwin/4.9.2”,我收到“警告:格式为 [-Wformat=] 的重复 ' ' 标志”,所以我认为这是一个正确的行为 --> 警告用户并允许重复的标志。
我还没有找到 C99/C11 规范指南来解决在尝试编写格式解析器时发现的这个角落问题。
如果允许重复,下面的代码是可以的。如果不允许重复,则第二个0 是宽度。那么说明符有2个宽度0和*,这又是一个问题。
// -------v
printf("%00*d\n", 5, 78); // 00078
【问题讨论】:
-
FWIW,我在 VS 2008 和 VS 2010 上得到了相同的结果。
-
当然不需要警告,即使是格式不正确的字符串。格式字符串可以在运行时构造;在一般情况下,编译器无法判断它是否正确。一些编译器,例如 gcc,会在格式字符串是文字时警告不正确的格式字符串(最常见的情况)。 (这并不能回答您关于是否允许重复标志的问题。)
-
我见过
printf的一些实现,并且我已经写了至少4 个不同的。它们都将重复的标志处理为等同于单个标志,原因很简单,这样做要简单得多,而且对于少数对此感到疑惑的实现者来说,这似乎并没有错。 -
@chqrlie 同意将重复标志处理为等同于单个标志更简单。
标签: c printf language-lawyer