C++的标准库在解析(浮点(数字时使用哪些信息
以下是我所知道的用std c++解析(单个(浮点数的可能性:
double atof( const char *str )
sscanf
double strtod( const char* str, char** str_end );
istringstream
、经由operator>>
或- 直接通过
num_get
很明显,至少,我们必须知道什么字符被用作小数分隔符。
iostreams,特别是num_get::get
,此外还谈到:
ios_base
I/O格式标志-这里是否有解析浮点时使用的任何信息thousands_sep
加速器(*见下文(
另一方面,在std::strtod
中,似乎是sscanf
的定义(反过来又被num_get
引用(,唯一的变量信息似乎是什么被认为是空间和十进制字符,尽管似乎没有指定是在哪里定义的。(至少在cppref和MSDN上都没有。(
那么,实际使用的信息是什么?C++标准库的有效可解析浮点表示是什么?
据我所见,只需要全局中的十进制分隔符(C
或C++
??(,此外,如果数字包含千位分隔符,我希望它只能由num_get
正确解析,因为strod
/sscanf
不支持千位分隔。
(*(组(千(分隔符对我来说是一个有趣的例子;CCD_ 18";函数不会对进行任何引用,上次我检查C
和C++
标准printf
函数时,它永远不会写入。那么,它真的是由strtod
/scanf
函数处理的吗?(我知道组分隔符有一个POSIXprintf扩展,但这并不是真正的标准,而且在微软的实现中明显缺失。(
strtod()
的C11规格似乎有一个足够大的开口,可以让任何尺寸的卡车通过。它看起来是如此开放,我认为没有限制。
§7.22.1.3 6除"C"语言环境外,还可以接受其他特定语言环境的主题序列形式。
对于非"标准C"语言环境,isspace()
、十进制(基数(点、组分隔符、每组数字和符号似乎构成了典型的变体。但显然没有限制。
为了好玩,使用printf()
、sscanf()
、strftime()
和isspace()
对500多个区域设置进行了实验。
所有测试的区域设置的基数(十进制(点为'.'
或','
,具有相同的+/-号,没有数字分组,并且预期为0-9。
strftime(... "%Y" ...)
在1000-99999年间没有使用数字分隔符。
CCD_ 33和CCD_。
0到255范围内的所有CCD_ 35值产生相同的CCD_。
当然,这些测试并不能证明对可能发生的事情的限制,但确实代表了一个可能性的样本。