【问题标题】:sscanf converting from octal: How does it know?sscanf 从八进制转换:它怎么知道?
【发布时间】:2021-11-25 17:35:33
【问题描述】:

我有这段代码可以将字符串转换为 int

unsigned int formatInt(char *ptr) {
    int res;
    if (sscanf(ptr, "%i", &res) == -1) exit(-1);
    return res;
}

我给它一个char * 指向“00000000041”的第一个字符。

转换为 int 返回 33(隐式八进制到十进制转换)

“00000000041”实际上是一个字符串(char[12]),但它是八进制文件的大小。

编译器怎么知道它是八进制的? 00000000041 完全可以是小数 (41)

【问题讨论】:

  • scanf “转换为十进制”,但它可以十进制转换。当您使用 %i 时,它会从前导 0 检测八进制,但在您使用 %d 时不会检测到。
  • @WeatherVane 为什么前面的 0 表示八进制?它可能完全意味着十进制。 041 可能是 41。对不起,我没有得到“从十进制转换”。在这里,我给它一个它检测到的“八进制”,然后 %i 返回一个小数。所以从技术上讲,它从八进制到十进制正确吗?
  • 根据定义。它不是“十进制”而是二进制。数字以十进制形式存储在字符串或 BCD 表示法中。
  • "%i" 表示“如果有前导零,则将其视为八进制”。
  • @Eljay haha​​ 我认为 %i 的意思是匹配一个 int。谢谢大家

标签: c++ c scanf


【解决方案1】:

将字符串识别为八进制是%i 格式说明符到scanf 的函数。从手册页:

   i      Matches an optionally signed integer; the next pointer must be a
          pointer to int.  The integer is read in base  16  if  it  begins
          with  0x  or  0X,  in base 8 if it begins with 0, and in base 10
          otherwise.  Only characters that  correspond  to  the  base  are
          used. 

所以因为字符串以 0 开头并且使用了%i,所以它被解释为八进制字符串。

【讨论】:

  • 非常感谢。关闭。
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2012-10-20
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
相关资源
最近更新 更多