C printf 0 flag& amp; width属性和精度标志

时间:2016-11-12 01:37:56

标签: c printf libc

我目前正在学习libc的printf功能,我不明白,有什么区别:

printf("Test : %010d", 10);

使用0标志和10作为宽度说明符

printf("Test : %.10d", 10);

使用10作为精确说明符

产生相同的输出:Test : 0000000010

4 个答案:

答案 0 :(得分:3)

我们将从the docs for printf()开始,我将突出显示相关内容。

第一个0填充。

  

`0'(零)

     

零填充。 对于除n以外的所有转换,转换后的值在左侧用零填充而不是空格。 如果使用数字转换(d,i,o, u,i,x和X),忽略0标志。

然后精确。

  

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

IF p_store != 0 then select store_name from store where store = p_store else select store_name from store; 表示将零填充到最小宽度为10位。没问题。

%010d,因为你正在使用%.10d",所以要显示的最小位数是10.所以与零填充相同。 %d会表现得更像您的期望。

我建议你使用%.10f来填零。 %010d形式是一个令人惊讶的功能,可能会让读者感到困惑。我不知道它,我很惊讶它不会被忽视。

答案 1 :(得分:2)

两种格式对正数产生相同的输出,但对于大于-1000000000的负数,输出不同:

printf("Test : %010d", -10);生成-000000010

,而

printf("Test : %.10d", -10);生成-0000000010

格式%010d使用前导零填充输出,最多为 width 10个字符。

格式%.10d将转换后的数字填充为前导零,最多10个位数

如果您不想为值0生成输出,而是生成%d之类的正常转换,则第二种形式非常有用:

printf("%.0d", 0);  // no output
printf("%.0d", 10);  // outputs 10

另请注意,第一种形式的初始0是一个标志:它可以按照%0+10d生成+000000010的任何顺序与其他标志组合使用,并且可以使用它使用printf("%0*d", 10, 10);中的间接宽度生成0000000010

答案 2 :(得分:1)

除了纯粹的概念之外,没有什么区别。

在第一种情况下,您只需使用完全独立的填充0字符填充空白区域。在第二种情况下,这些零是转换参数值时创建的前导零。 (这无疑是非常人为的。)

无论如何,这些零看起来,闻起来和嘎嘎一样。

但是,在一般情况下,当精度与填充字段宽度不同时,会出现一个模糊的特定情况:当您要求零字段宽度和打印零值时。当使用零精度时,根本不打印零值。当使用零 field-width 时,零值将照常显示

printf("%00d\n", 0); // prints '0'
printf("%.0d\n", 0); // prints nothing

显然这也是一种非常人为的情况,因为在这种情况下不会出现填充。

答案 3 :(得分:1)

在你的第二个案例中你可能期望 10.0000000000 - 但%d仅适用于整数。规范说:

  

对于整数说明符(d,i,o,u,x,X):precision指定要写入的最小位数。

(精度是以.开头的部分,因此在您的情况下为10。)