【发布时间】:2014-04-04 14:30:23
【问题描述】:
我试图从正在解析的命令行中找出哪个函数最适合将十进制、十六进制或八进制数转换为 int 最好 — 事先不知道输入。
然后目标是使用一个函数来识别不同类型的输入并将其分配给它的整数 (int) 值,然后可以这样使用:
./a.out 23 0xC4 070
可以打印
23
196 /*hexadecimal*/
56 /*octal*/
我能看到的唯一问题是解析以找出十进制整数和八进制之间的差异。
附带问题,这对于将字符串转换为整数以供使用是否稳定?
【问题讨论】:
-
atoi()和atol()在错误恢复方面非常有限;sscanf()太复杂了;使用strtol()或strtoul()。 -
"事先不知道输入" 你的意思是你不知道数字的各自基数吗?没有一般的方法可以从数字的数字推断出它的基数。例如,“70”可以是基数 8 或基数 10 或基数 16。
-
没有关于表示含义的信息,没有人可以解释它。通常我们使用文化民间传说来传达这些信息(例如“八进制前导 0”);如果你想要一些与此不同的东西,你会 a) 让每个人都感到不安,并且 b) 必须编写自己的代码。
-
如果您将
0作为base参数传递给strtol或strtoul,它们将检测输入的基数,但仅限于可以判断的范围内,使用 tesseract 提到的前缀。所以如果你想让70被视为八进制,你需要使用070,然后strtoul("070", NULL, 0)会返回56(十进制)。我很确定strtoul("C4", NULL, 0)将返回 196,尽管缺少0x前缀,但这只是因为C泄露了它是十六进制的事实。 -
@MikeHolt 您应该将其发布为答案。恐怕
"C4"不会转换为十六进制,但前缀是必需的。规则与源代码中的整数文字相同,这是有道理的。
标签: c