[英]What information is used when parsing a (float) number?
这是我知道的用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
arator( 见下面 ) 另一方面,在std::strtod
,这似乎是sscanf
所定义的(依次由num_get
引用),那里唯一的变量信息似乎是被认为是空格和十进制字符的信息,尽管似乎没有在定义位置指定它 。 (至少在cppref或MSDN上都没有。)
那么,实际上使用了哪些信息,什么构成了C ++ Standard库的有效可解析浮点表示形式?
从我所看到的,仅需要全局( C
或C++
???)中的小数点分隔符,此外,如果数字包含千位分隔符,我希望它只能由num_get
正确解析,因为strod
/ sscanf
不支持千位分隔符。
(*)组(千位)分隔符对我来说是一个有趣的案例。 据我所知,“ C
”函数没有对其进行任何引用,并且上次我检查C
和C++
标准printf
函数将永远不会编写它。 那么它真的是由strtod
/ scanf
函数处理的吗? (我知道组分隔符有一个POSIX printf扩展名,但这并不是真正的标准,尤其是在Microsoft的实现中缺少。)
C11的strtod()
规范似乎有足够大的开口,可让任何大小的卡车驶过。 它似乎是开放式的,我认为没有限制。
§7.22.1.36在“ C”语言环境之外,还可以接受其他特定于语言环境的主题序列形式。
对于非“标准C”语言环境, isspace()
,十进制(基数)点,组分隔符,每组位数和符号似乎构成了典型的变体。 但是显然没有限制。
使用printf()
, sscanf()
, strftime()
和isspace()
在500多个语言环境中进行了有趣的实验 。
所有测试的语言环境的基数(小数点)均为'.'
或','
,相同的+/-号,无数字分组以及预期的0-9。
在1000-99999年内, strftime(... "%Y" ...)
未使用数字分隔符。
sscanf("1,234.5", "%lf", ..
和sscanf("1.234,5", "%lf", ..
在任何语言环境中均不会产生1234.5。
0到255范围内的所有int
值都产生相同的isspace()
结果,有时是154和160例外。
当然,这些测试并不能证明可能会发生什么,但确实代表了一种可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.