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

问题描述

  1. 我正在尝试在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.
    
  2. 当我使用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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...