Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 作为printf占位符的%0.2lf和%.2lf之间有什么区别?_C_Format_Width_Printf - Fatal编程技术网

C 作为printf占位符的%0.2lf和%.2lf之间有什么区别?

C 作为printf占位符的%0.2lf和%.2lf之间有什么区别?,c,format,width,printf,C,Format,Width,Printf,我知道在占位符的宽度之前放置任意数量的0,可以实现零填充。例如,printf(“%02d”,6)打印06 但是在占位符的精度之前放置一个0会做什么呢?例如,对于printf(“%0.2lf”,0.123)和printf(“%.2lf”,0.123),输出为0.12 如果它不起作用,是否有首选格式?它们是“等效的”。如果要使用“%07.2”,则在前面添加额外的零会产生不同 编辑:最初有“%04.2”,这当然没有任何区别,因为带两个小数的浮点始终是4宽。%3.2f//(以浮点打印,宽度至少为3宽,精

我知道在占位符的宽度之前放置任意数量的
0
,可以实现零填充。例如,
printf(“%02d”,6)打印
06

但是在占位符的精度之前放置一个
0
会做什么呢?例如,对于
printf(“%0.2lf”,0.123)
printf(“%.2lf”,0.123),输出为
0.12

如果它不起作用,是否有首选格式?

它们是“等效的”。如果要使用“%07.2”,则在前面添加额外的零会产生不同

编辑:最初有“%04.2”,这当然没有任何区别,因为带两个小数的浮点始终是4宽。


%3.2f//(以浮点打印,宽度至少为3宽,精度为2)


%0.2lf//(以浮点形式打印,宽度至少为0,精度为2)


%.2lf//(以浮点形式打印,宽度至少为0(默认值),精度为2)

大宗报价

基本上,当我们输出
%w.p f
w
指用于显示值的最小位置数,
p
指小数点后的位数。
%3.2f
小数点后有3个宽和2个数字的浮点

%0.2f
浮点至少0宽,小数点后2个数字

%.2f
浮点宽度至少为0(默认值)且精度为2)


但是,如果您使用
%0.2f
它可以自动调整其最小宽度,请不要误解0宽度。

这些示例应显示其区别:

“%0.2lf”,0.123
->
0.12
(零填充最小宽度为0,小数点后两位)

“%6.2lf”,0.123
->
\uu 0.12
(最小宽度为6,小数点后两位的空格填充)

“%06.2lf”,0.123
->
000.12
(零填充最小宽度为6,小数点后两位)

“%0.6lf”,0.123
->
0.123000
(最小宽度为0,小数点后6位)

第一个零指定零填充,后面是最小宽度,默认值为0。因此,它本身实际上被忽略(因为不能填充0宽度)



顺便说一句,正确的形式是
%f
,而不是
%lf
,对于
printf

,如果明确指定了精度,它(0'-填充)不是被忽略了吗?至少在Linux上的gcc中测试时,零填充“起作用”。我很确定这是标准的一部分,但我有点懒,所以我会等待其他人指出我错了。@DyP-零填充在左边,例如0003.12。它不适用于小数点后的零。@teppic C标准(C99和n1256)说,在
%0”
中,
0
被解释为一个标志,意思是“使用0填充”。但是没有指定最小字段宽度(介于
0
之间),因此,它实际上被忽略。我以前的信息是从cppreference获得的,但这与标准上说的有点不同。@teppic我同意这不重要,但您的陈述不准确(“0本身指定最小宽度为0”),其中有一个微妙之处,例如,
%0s”
导致未定义的行为,因为
0
被视为一个标志。@teppic,0并不意味着最小宽度为0(这是什么样的无用信息?)。0是一个标志,表示0-pad而不是空格pad。从你的回答中我可以看出,你已经知道了,所以请不要再说它的意思是“最小宽度为0”,因为它不知道。@Shahbaz-我在谈论这个具体的案例,但由于它似乎会引起混乱,我删除了这个评论。在我们讨论这个问题时,整数提升规则(见C11,6.5.2.2.6)强制将浮点值转换为双精度。这意味着
float
double
都达到
printf
double
,因此
%f
%lf
都期望
double
,因此是相同的。这就是为什么您永远看不到
%hd
,因为它的工作原理与
%d
完全相同。此外,这就是为什么如果将字符赋给
%d
,则不需要将其强制转换为int。旁注:这与
scanf
不同,因为例如
char*
不会升级为
int*
@沙巴兹-作为一个侧面点,是的。如果我没记错的话,C99中允许使用
%lf
,但完全忽略了
l
——尽管%lf可能会给较旧的编译器带来问题。