问题描述
在下面的程序中
#include< stdio.h>
int main()
{
int id = 123,io = 0123,ih = 0x123;
long ld = 1234567L,lo = 01234567l,lh = 0X1234567L;
float f = 123.456f;
double d = 01234.56789L;
printf(" id =%d \ t%o \ t%x \ nio =%d \ t%\\\ t%x \ nhh =%d \ t%O \%x \ n",
id,id,id,io, io,io,ih,ih,ih);
printf(" ld =%ld \ t%lo \ t%lx \ nlo =%ld \ t%lo \ t%lx \ nlh =%ld \ t%lo \ t%l \ n",
ld,ld,ld,lo,lo,lo,lh,lh,lh) ;
printf(" f =%lf \ t%le \ t%lg \ n =%lf \ t%lE \ t%lG \ n,f, f,f,d,d,d);
返回0;
}
输出得到:
id = 123 173 7b
io = 83 123 53
ih = 291%O 123
ld = 1234567 4553207 12d687
lo = 3 42391 1234567 53977
lh = 19088743 110642547 1234567
f = 123.456001 1.234560e + 02 123.456
d = 1234.567890 1.234568E + 03 1234.57
为什么第3行中有%O而不是预期的八进制o / p?
并且对于d而言,最后一个o / p是1234.57。但%g是%lf或%le
对吗?所以如果它是%lf那么为什么它是1234.57而不是1234.56789?
谢谢
in program below
#include <stdio.h>
int main()
{
int id = 123, io = 0123, ih = 0x123;
long ld = 1234567L, lo = 01234567l, lh = 0X1234567L;
float f = 123.456f;
double d = 01234.56789L;
printf("id = %d\t%o\t%x\nio = %d\t%o\t%x\nih = %d\t%O\t%X\n",
id, id, id, io, io, io, ih, ih, ih);
printf("ld = %ld\t%lo\t%lx\nlo = %ld\t%lo\t%lx\nlh = %ld\t%lo\t%l\n",
ld, ld, ld, lo, lo, lo, lh, lh, lh);
printf("f = %lf\t%le\t%lg\nd = %lf\t%lE\t%lG\n", f, f, f, d, d, d);
return 0;
}
the output got is:
id = 123 173 7b
io = 83 123 53
ih = 291 %O 123
ld = 1234567 4553207 12d687
lo = 342391 1234567 53977
lh = 19088743 110642547 1234567
f = 123.456001 1.234560e+02 123.456
d = 1234.567890 1.234568E+03 1234.57
why is there a %O in line 3 instead of octal o/p expected?
and in line for d the last o/p is 1234.57. but %g is either %lf or %le
right? so if it is %lf then why is it 1234.57 instead of 1234.56789?
thanks
推荐答案
八进制输出的格式说明符是%o,而不是%O。在C情况下,
很重要。
The format specifier for octal output is %o, not %O. In C case is
important.
我认为这是一个精确的问题。
I think that''s a precision issue.
因为你把它放在那里。格式字符串的相关片段是
ih =%d \ t%O \ t%X \ n
注意%O in上面的字符串?没有%O转换说明符,
和八进制转换说明符是%o
Because you put it there. The relevant fragment of the format string is
ih = %d\t%O\t%X\n
Notice the %O in the string above? There is no %O conversion specifier,
and the "octal" conversion specifier is %o
谢谢Lew。是否有一个说明符,它会在八进制前面加一个0
数?喜欢0x为%#x?
thanks Lew. is there a specifier which will put a 0 in front off the octal
number? like 0x for %#x?
0%o怎么样?和0x%x?
[...]
-
+ - ----------------------- + -------------------- + ----- ------------------ +
| Kenneth J. Brody | | #include |
| kenbrody / at\spamcop.net | | < std_disclaimer.h |
+ ------------------------- + --------- ----------- + ----------------------- +
不要 - 邮寄给我:< mailto:Th ************* @ gmail.com>
What about "0%o" and "0x%x"?
[...]
--
+-------------------------+--------------------+-----------------------+
| Kenneth J. Brody | www.hvcomputer.com | #include |
| kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h|
+-------------------------+--------------------+-----------------------+
Don''t e-mail me at: <mailto:Th*************@gmail.com>
%#o
C89 4.9.6.1 fprintf功能
#结果将转换为替代形式。对于o
转换,它会增加精度以强制结果的第一个数字
为零。对于x(或X)转换,
非零结果将以0x(或0X)作为前缀。 [...]
%#o
C89 4.9.6.1 The fprintf Function
# The result is to be converted to an "alternate form." For o
conversion, it increases the precision to force the first digit
of the result to be a zero. For x (or X) conversion, a
nonzero result will have 0x (or 0X) prefixed to it. [...]
C89没有%F(但确实有%E和%G)。 %E和%G使用
资本E代表指数代号,而不是小写e />
,但分别与%e和%g相同。 br />
-
我们观察到的怪癖和随意性迫使我们得出结论,即我们不是唯一的宇宙。 - Walter Kistler
C89 does not have %F (but does have %E and %G). %E and %G use a
capital E for the exponent signifier instead of a lower-case e
but are otherwise the same as %e and %g respectively.
--
"The quirks and arbitrariness we observe force us to the
conclusion that ours is not the only universe." -- Walter Kistler
这篇关于双printf格式......的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!