The*_*ton 5 c++ stringstream libc++
我有以下代码:
#include <string>
#include <iostream>
#include <sstream>
int main()
{
size_t x, y;
double a = std::stod("1_", &x);
double b = std::stod("1i", &y);
std::cout << "a: " << a << ", x: " << x << std::endl;
std::cout << "b: " << b << ", y: " << y << std::endl;
std::stringstream s1("1_");
std::stringstream s2("1i");
s1 >> a;
s2 >> b;
std::cout << "a: " << a << ", fail: " << s1.fail() << std::endl;
std::cout << "b: " << b << ", fail: " << s2.fail() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我想解析一个double并在遇到无效字符时停止.在这里,我尝试分析"1_"和"1i",这两者应该给我用值双:1.
这是我的输出:
a: 1, x: 1
b: 1, y: 1
a: 1, fail: 0
b: 0, fail: 1
Run Code Online (Sandbox Code Playgroud)
所以stod函数按预期工作,但stringstream方法没有.对我来说,在标准库中解析double的两种标准方法会产生不同的结果是没有意义的吗?
解析时为什么stringstream方法失败:"1i"?
编辑:
这似乎给某些人带来了不同的结果.我的编译器信息如下:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Run Code Online (Sandbox Code Playgroud)
EDIT2:
这是libc ++的一个错误,还是规范只是模糊了什么算作双重的有效解析?
这是一个libc ++ bug.根据[facet.num.get.virtuals] bullet 3.2,如果允许字符作为在阶段1(%gfor double)中确定的转换说明符的输入字段的下一个字符,则应该累积该字符.累积后1,i不允许,因此第2阶段应该终止.
libc ++不加选择地累积字符,直到它到达非原子字符(它还将原子扩展为include i,这是解析inf所必需的).