问题描述
-
我正在尝试在C语言中打印八进制和十六进制数。以下是按预期的打印方式
int a = 012; printf("%d",a); //printing as 10. The decimal representation of octal 12.
但是,当我使用
012
扫描%d
时,0
被忽略,并且正在打印12
。是什么原因?int b; scanf("%d",&b); printf("%d",b); //printing 12.
-
当我使用
0x12
扫描%d
时,输出如下所示0
int b; scanf("%d",b); //printing 0
这是什么原因?为什么他们没有给出任何运行时错误?
提前谢谢!
解决方法
%d
的{{1}}格式说明符明确要求数字格式为十进制整数。因此,当您输入“ 012”时将读取12,因为前导0实际上被忽略。然后,当您输入“ 0x12”时,扫描将在字符“ x”处停止,因此将读取值0。
如果您使用scanf
格式说明符,则如果字符串以“ 0x”开头,它将使用十六进制,如果字符串以“ 0”开头,则将使用八进制,否则将使用十进制。
说明
int a = 012; // a is assigned decimal value 10 (012 is octal = 10 in decimal)
printf("%d",a); // printing a in decimal as 10
对于第一个代码段,您要分配a = 10(代表八进制012)并以十进制格式打印。
int b;
scanf("%d",&b); // read an integer in decimal format
printf("%d",b); //printing 12 because the input was 12 after ignoring the 0.
当您将scanf与%d一起使用时,它期望使用十进制格式的整数。因此它忽略了前0个,并将b = 12赋值。打印时,您看到的是12。
int b;
scanf("%d",&b);
printf("%d",b); //printing 0
在上述情况下,您要求scanf读取十进制格式的整数,并且当您输入0x12时,由于x不能是有效整数的一部分,因此它在读取0后停止在字符x处扫描。
解决方案
这就是要走的路。
"%d" - to input decimal value
"%o" - to input integer value in an octal format
"%x" - to input integer value in hexadecimal format
"%i" - to input integer in any format (decimal/octal/hexadecimal)