【问题标题】:Scanning an octal and hexadecimal number in %d format specifier with scanf使用 scanf 扫描 %d 格式说明符中的八进制和十六进制数
【发布时间】:2021-01-07 20:21:12
【问题描述】:
  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
    

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

提前致谢!!!

【问题讨论】:

  • Re "printing as 10. the octal of 12.",这是不正确的。它打印 10,这是 12 八进制十进制表示。

标签: c hex scanf format-specifiers octal


【解决方案1】:

说明

int a = 012;    // a is assigned decimal value 10 (012 is octal = 10 in decimal)
printf("%d",a); // printing a in decimal as 10

在第一个代码 sn-p 的情况下,您指定 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.

当您使用带有 %d 的 scanf 时,它需要一个十进制格式的整数。所以它忽略了第一个 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)

【讨论】:

    【解决方案2】:

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

    如果你使用%i格式说明符,如果字符串以“0x”开头,它将使用十六进制,如果以“0”开头,它将使用八进制,否则使用十进制。

    【讨论】:

    • 如果字符串以“0x”开头,它将使用十六进制...更准确地说:如果字符串以0x开头,后跟一个十六进制数字,它将使用十六进制,否则它将使用八进制并停在x
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2023-02-10
    • 2019-04-29
    • 2017-09-16
    • 2016-09-04
    • 2011-08-21
    相关资源
    最近更新 更多