当strtod没有时,为什么strol需要一个基数?

时间:2015-10-12 15:39:49

标签: c++ base radix strtol strtod

我最近一直在使用cin输入,我发现strtol需要一个基数:long int strtol (const char* str, char** endptr, int base);,但是strtod没有:double strtod (const char* str, char** endptr);。显然,双数可以用其他基数表示,那为什么会出现这种二分法呢?

2 个答案:

答案 0 :(得分:2)

strtol通常与设置为base0的{​​{1}}一起使用。 10使它将字符串视为C整型常量。它对八进制使用前导base==0,对十六进制使用前导00x;否则,它被假定为十进制。对于0X,它不会识别十进制以外的任何内容(这更加用户友好;大多数用户都希望base==10的输入被解释为010 })。

浮点数可以用十进制以外的基数表示,但C ++只支持十进制。 (C在1999 ISO C标准中添加了对十六进制浮点的支持,但C ++没有采用此功能。)

8 可以选择将strtod解释为基数为8的常量,等于1.4十进制 - 但是只是没有足够的需求来证明它。

整数输入可能有用地写在基数2,8,10和16中,1.5允许其他基数只是因为它很容易这样做。浮点输入很少是十进制以外的任何东西(C十六进制浮点常量的语法是明确的,因此不需要指定它。)

答案 1 :(得分:2)

原因是C ++中没有办法在除基数10之外的不同基数中表示浮点值。来自[lex.fcon] 2.13.4(1)

  

浮动文字由整数部分,小数点,小数部分,e或E,可选的有符号整数指数和可选的类型后缀组成。整数和分数部分都由一系列十进制(十进制)数字组成。 [...]

强调我的

如果浮点数只能用基数10表示,那么就没有必要指定基数。另一方面,整数类型可以用不同的贝母表示,strtol处理它。