我目前正在学习libc的printf
功能,我不明白,有什么区别:
printf("Test : %010d", 10);
使用0
标志和10
作为宽度说明符
和
printf("Test : %.10d", 10);
使用10
作为精确说明符
产生相同的输出:Test : 0000000010
答案 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
。)