使用 scanf 扫描 %d 格式说明符中的八进制和十六进制数

Scanning an octal and hexadecimal number in %d format specifier with scanf

  1. 我正在尝试用 C 打印八进制和十六进制数。以下是按预期打印

    int a = 012;
    printf("%d",a); //printing as 10. The decimal representation of octal 12.
    

    但是,当我使用 %d 扫描 012 时,0 被忽略并且正在打印 12。这是什么原因?

    int b;
    scanf("%d",&b);
    printf("%d", b); //printing 12.
    
  2. 当我使用 %d 扫描 0x12 时,输出为 0 如下

    int b;
    scanf("%d",&b);
    printf("%d", b); //printing 0
    

这是什么原因?为什么他们没有给出任何运行时错误?

提前致谢!!!

scanf%d 格式说明符明确需要一个格式化为十进制整数的数字。因此,当您输入“012”时,读取的是 12,因为前导 0 基本上被忽略了。然后,当您输入“0x12”时,扫描会在字符“x”处停止,因此会读取值 0。

如果您使用 %i 格式说明符,如果字符串以“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 时,它会在读取 0 后停止扫描字符 x,因为 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)