C格式说明符问题

Vij*_*jay 1 c c++ unix printf

在我工作的时候,我遇到了一个由其他人写的代码.我看到一个声明,

sprintf(o_params->o_file_name,
        "%s_%s_%04.4d_%s_%s.ASC",
        "OUTD", "RM", sequence_no, DateStamp_buf1, TimeStamp_buf1
);
Run Code Online (Sandbox Code Playgroud)

在上面的陈述中,我看到了%04.4d.这是一个正确的格式说明符吗?

变量sequence_nostatic int,它没有小数.

小智 7

来自FreeBSD手册页 man 3 printf

一个可选的精度,以句点的形式.后跟一个可选的数字字符串.如果省略数字字符串,则精度为零. 这给出了d,i,o,u,x和X转换的最小位数,a,e,E,f和F转换的小数点后出现的位数, g和G转换的最大有效位数,或者s转换为字符串打印的最大字符数.

所以在这种情况下,%04.4d中,.4该号码的所有四个数字应打印指定.当然,04如果小于1000 ,该部件只用前导零填充数字.但是,在这种情况下,如上面的手册页所述,

"0"(零)零填充.对于除n之外的所有转换,转换后的值在左侧用零填充而不是空白. 如果使用数字转换(d,i,o,u,i,x和X)给出精度,则忽略0标志.

因为无论如何肯定会打印所有四位数字,我的猜测是它只是一个遗留物或错字或其他东西.此语法产生编译器警告gcc -Wall(请参阅Sinan Unur的示例),但它似乎不是实际错误.