C中的宽度格式化程序

时间:2018-02-05 18:25:00

标签: c

我遇到了一个奇怪的问题。

鉴于此计划:

preStart

输出是0100,我可以理解为什么。如果我将其更改为

#include <stdio.h>

int main()
{
    printf("%04d",100);
    return 0;
}

我得到的输出为100,前面有一个空白。忽略0。我的问题是宽幅格式器在这些情况下是如何工作的?

2 个答案:

答案 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.

它具有完全不同的含义,但很少见到它的特定方面。