C++ 为什么strol需要一个基数而strod不需要?

C++ 为什么strol需要一个基数而strod不需要?,c++,base,radix,strtol,strtod,C++,Base,Radix,Strtol,Strtod,我最近一直在使用cin输入,我发现strtol需要一个基数:long int strtol(const char*str,char**endptr,int base),但strtod没有:双strtod(const char*str,char**endptr)。显然,双数可以用其他基数表示,那么为什么这种二分法呢?strtol通常与base一起使用,设置为0或10base==0使其将字符串视为C整数常量。它使用前导的0表示八进制,或前导的0x或0x表示十六进制;否则,假定它是十进制的。对于bas

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

strtol
通常与
base
一起使用,设置为
0
10
base==0
使其将字符串视为C整数常量。它使用前导的
0
表示八进制,或前导的
0x
0x
表示十六进制;否则,假定它是十进制的。对于
base==10
,它只能识别十进制(这更方便用户;大多数使用不会将
010
的输入解释为
8

浮点数可以用小数以外的基表示,但C++只支持十进制。(C在1999 ISO C标准中增加了十六进制浮点的支持,但C++没有采用这个特性)

strtod
可以选择将
1.4
解释为基数为8的常量,等于
1.5
decimal,但是没有足够的需求来证明它的合理性


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

strtol
通常与
base
一起使用,设置为
0
10
base==0
使其将字符串视为C整数常量。它使用前导的
0
表示八进制,或前导的
0x
0x
表示十六进制;否则,假定它是十进制的。对于
base==10
,它只能识别十进制(这更方便用户;大多数使用不会将
010
的输入解释为
8

浮点数可以用小数以外的基表示,但C++只支持十进制。(C在1999 ISO C标准中增加了十六进制浮点的支持,但C++没有采用这个特性)

strtod
可以选择将
1.4
解释为基数为8的常量,等于
1.5
decimal,但是没有足够的需求来证明它的合理性


整数输入可以用基数2、8、10和16编写,并且
strtol
允许使用其他基数,因为这样做很容易。浮点输入很少是十进制以外的任何东西(C十六进制浮点常量的语法是明确的,所以不需要指定它)。原因是,C++中没有其他方法来表达不同于基10的不同的浮点值。摘自[fcon法]2.13.4(1)

浮点文字由整数部分、小数点、小数部分、e或e、可选带符号整数指数和可选类型后缀组成。整数和小数部分都由一系列十进制(以十为基数)数字组成。[……]

重点矿山


如果浮点数只能以10为基数表示,则没有理由必须指定基数。另一方面,整数类型可以用不同的BASS来表达,而代码<> Stotol 处理。

< P>这是因为C++中没有方法在不同的基中表达基点10以外的浮点值。摘自[fcon法]2.13.4(1)

浮点文字由整数部分、小数点、小数部分、e或e、可选带符号整数指数和可选类型后缀组成。整数和小数部分都由一系列十进制(以十为基数)数字组成。[……]

重点矿山


如果浮点数只能以10为基数表示,则没有理由必须指定基数。另一方面,整数类型可以用不同的基来表示,以
strtol
处理这个问题。

你能举一个用另一个基表示的双精度的例子吗?虽然双精度可以用其他基表示,但它们很少用,而(至少在程序员中)长/整数等通常是合理的。另外,可以将其视为strtol可以接受基数(即提供额外的功能)。。。它不需要。@PanagiotisKanavos类似于(1.1)2==(1.5)10,我猜。但是,哎呀,我在现实世界中从来没有见过有人这样做,所以我猜根本没有人在乎,所以也没有人提议把它放进去。这很公平。这回答了我的问题。如果有人想回答,我会记下来。你能举一个用另一个基数表示的double的例子吗?虽然double可以用其他基数表示,但它们很少用,而(至少在程序员中)long/int等经常用。另外,可以将其视为strtol可以接受基数(即提供额外的功能)。。。它不需要。@PanagiotisKanavos类似于(1.1)2==(1.5)10,我猜。但是,哎呀,我在现实世界中从来没有见过有人这样做,所以我猜根本没有人在乎,所以也没有人提议把它放进去。这很公平。这回答了我的问题。如果有人想回答,我会记下来的<代码>std::cout@D.Shawley它可能是一个扩展名。GCC喜欢包含C特性,如VLA的,在C++中不是标准的。顺便说一句,它不会与MSVS 2015一起编译。另见:嗯<代码>std::cout@D.Shawley它可能是一个扩展名。GCC喜欢包含C特性,如VLA的,在C++中不是标准的。顺便说一句,它不会与MSVS 2015一起编译。另请参阅:@Defensetrator:请阅读更新;我最初对C和C++之间的一些差异进行了注释。