我遇到了一个奇怪的问题。
鉴于此计划:
preStart
输出是0100,我可以理解为什么。如果我将其更改为
#include <stdio.h>
int main()
{
printf("%04d",100);
return 0;
}
我得到的输出为100,前面有一个空白。忽略0。我的问题是宽幅格式器在这些情况下是如何工作的?
答案 0 :(得分:5)
对于%d
,如果指定了精度(指定了最小字符数),则忽略0
标志,因为它正在执行类似的功能。
手册页说明了0
标志的以下内容:
该值应为零填充。对于d,i,o,u,x,X,a,A,e, E,f,F,g和G转换,转换后的值填充在 留下零而不是空白。如果出现0和 - 标志,则忽略0标志。 如果给出精度 用数字 转换(d,i,o,u,x和X),忽略0标志。对于其他转换,行为未定义。
关于精度的以下内容:
一个可选的精度,以句点(&#39;。&#39;)的形式后跟一个 可选的十进制数字串。而不是十进制数字串一个 可以 写&#34; *&#34;或&#34; * m $&#34; (对于某些十进制整数m)指定在下一个参数或第m个参数中给出精度, 分别为int类型。如果精度仅为&#39;。&#39;,则精度为零。负精度 被视为 如果省略精度。 这为d,i,o,u,x和X转换显示的最小位数,数字 的数字 出现在a,A,e,E,f和F转换的基数字符之后,g和G的最大有效位数 转换,或 s和S转换的字符串中要打印的最大字符数。
在您的情况下,由于您为精度指定了1,因此需要打印最少1个字符。如果您使用4作为精度,那么您将获得一个前导零。
答案 1 :(得分:0)
标准格式化程序为well documented。 %d
特别适用于整数,&#34;十进制&#34;值。这意味着.
分隔符在这里毫无意义,因为它们不具有浮点值所需的任何特定精度。
该符号保留用于以下情况:
printf("%04.1f", 3.9);
哪个会给你03.9
,字段有四个字符,一个小数位,一个精度点。
在%d
的情况下,精度值的解释不同:
Precision指定要显示的最小位数。默认精度为1.
它具有完全不同的含义,但很少见到它的特定方面。