提问人:Martin Ba 提问时间:3/25/2014 最后编辑:CommunityMartin Ba 更新时间:3/25/2014 访问量:269
解析(浮点数)时使用哪些信息?
What information is used when parsing a (float) number?
问:
C++ 的标准库在解析(浮点数)时使用哪些信息?
以下是我知道使用 std c++ 解析(单个)浮点数的可能性:
double atof( const char *str )
sscanf
double strtod( const char* str, char** str_end );
istringstream
,通过 ORoperator>>
- 直接通过
num_get
很明显,至少,我们必须知道什么字符用作小数分隔符。
iostreams,特别是 num_get::get
,此外还讨论了:
ios_base
I/O 格式标志 - 解析浮点时是否使用了任何信息?- 仲裁员 (* 见下文
thousands_sep
)
另一方面,在 中,这似乎是根据 (反过来由 引用) 定义的内容,唯一的变量信息似乎是被认为是空格和十进制字符的内容,尽管它似乎没有指定定义的位置。(至少在 cppref 和 MSDN 上都没有。std::strtod
sscanf
num_get
那么,实际使用了哪些信息,以及 C++ 标准库的有效可解析浮点表示形式是什么?
据我所知,只需要全局(或???)的小数分隔符,此外,如果数字包含千位分隔符,我希望它只能通过 since / 不支持千位分隔符正确解析。C
C++
num_get
strod
sscanf
(*)组(数千)分隔符对我来说是一个有趣的案例。据我所知,“”函数没有引用它,上次我检查过,标准函数永远不会写它。那么它真的是由 / 函数处理的吗?(我知道组分隔符有一个POSIX printf扩展,但这并不是真正的标准,而且在Microsoft的实现中明显缺失。C
C
C++
printf
strtod
scanf
答:
C11 规格似乎有一个足够大的开口,任何尺寸的卡车都可以通过。它看起来如此开放,我看不出任何限制。strtod()
§7.22.1.3 6 除“C”语言环境外,还可以接受其他特定于语言环境的主题序列形式。
对于非“标准 C”语言环境,小数点(基数)、组分隔符、每组数字和符号似乎构成了典型的变体。但显然没有限制。isspace()
为了好玩,使用 、 和 .printf()
sscanf()
strftime()
isspace()
所有测试的区域设置的基数(小数点)均为 or、相同的 +/- 符号、无数字分组和预期的 0-9。'.'
','
strftime(... "%Y" ...)
在 1000-99999 年没有使用数字分隔符。
sscanf("1,234.5", "%lf", ..
并且没有在任何区域设置中产生 1234.5。sscanf("1.234,5", "%lf", ..
范围为 0 到 255 的所有值都产生相同的结果,但有时 154 和 160 除外。int
isspace()
当然,这些测试并不能证明可能发生的事情是有限的,但确实代表了可能性的样本。
评论
上一个:使用更快的 I/O 方法
评论
sscanf(3)
(和 、 和 和 ) 是 C 函数,用于向后兼容。它们(作为其 C++ 对应项)应遵循区域设置。scanf(3)
fscanf(3)
strtod(3)
num_get::get
sscanf