这是我用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
引用的),那里唯一可变的信息似乎是什么是considered a space和十进制字符,虽然似乎没有指定 定义的位置。 (至少在cppref和MSDN上都没有。)
那么,实际使用了哪些信息,以及包含C ++标准库的有效可解析浮点表示的内容?
从我看到的,只需要全局(C
或C++
???)中的小数分隔符,此外,如果数字包含千位分隔符,我希望它只有num_get
才能正确解析,因为strod
/ sscanf
不支持千位分隔符。
(*)组(千)分隔符对我来说是一个有趣的案例。据我所知,“C
”函数不会对其进行任何引用,而上次我检查C
和C++
标准{{1}函数永远不会写它。它是否真的由printf
/ strtod
函数处理? (我知道组分隔符有一个POSIX printf 扩展名,但这不是真正的标准,特别是微软的实现中没有。)
答案 0 :(得分:4)
strtod()
的C11规格似乎有一个足够大的开口,可供任何规模的卡车通过。它似乎是开放式的,我认为没有限制。
§7.22.1.36除“C”语言环境外,可以接受其他特定于语言环境的主题序列表格。
对于非“标准C”语言环境,isspace()
,十进制(基数)点,组分隔符,每组数字和符号似乎构成典型变体。但显然没有限制。
使用printf()
,sscanf()
,strftime()
和isspace()
,使用500多种语言区域进行实验实验。
所有测试的区域设置的基数(十进制)点为'.'
或','
,相同的+/-符号,无数字分组和预期的0-9。
strftime(... "%Y" ...)
在1000-99999年没有使用数字分隔符。
sscanf("1,234.5", "%lf", ..
和sscanf("1.234,5", "%lf", ..
未在任何区域设置中生成1234.5。
0到255范围内的所有int
值产生相同的isspace()
结果,有时除外154和160.
当然,这些测试不会证明对可能发生的事情的限制,但确实代表了可能性的样本。