为什么这个 stringstream 在解析成 double 时会失败?
Why does this stringstream fail when parsing into double?
我有以下代码:
#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;
}
我想解析双精度并在遇到无效字符时停止。在这里,我尝试解析 "1_"
和 "1i"
,这两个都应该给我 double 值:1
.
这是我的输出:
a: 1, x: 1
b: 1, y: 1
a: 1, fail: 0
b: 0, fail: 1
所以 stod
函数按预期工作,但是 stringstream 方法没有。对我来说,标准库中的 2 种标准的 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
编辑2:
这是 libc++ 的错误,还是规范只是含糊不清什么才算是双精度的有效解析?
这是一个libc++ bug. Per [facet.num.get.virtuals] bullet 3.2,如果一个字符被允许作为第 1 阶段确定的转换说明符的输入字段的下一个字符,则该字符才应该被累积(%g
for double
).累积1
后,不允许i
,因此阶段2应该终止。
libc++ 不加区别地累积字符,直到达到非原子字符(它还扩展了原子以包括 i
,这是解析 inf 所必需的)。
我有以下代码:
#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;
}
我想解析双精度并在遇到无效字符时停止。在这里,我尝试解析 "1_"
和 "1i"
,这两个都应该给我 double 值:1
.
这是我的输出:
a: 1, x: 1
b: 1, y: 1
a: 1, fail: 0
b: 0, fail: 1
所以 stod
函数按预期工作,但是 stringstream 方法没有。对我来说,标准库中的 2 种标准的 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
编辑2:
这是 libc++ 的错误,还是规范只是含糊不清什么才算是双精度的有效解析?
这是一个libc++ bug. Per [facet.num.get.virtuals] bullet 3.2,如果一个字符被允许作为第 1 阶段确定的转换说明符的输入字段的下一个字符,则该字符才应该被累积(%g
for double
).累积1
后,不允许i
,因此阶段2应该终止。
libc++ 不加区别地累积字符,直到达到非原子字符(它还扩展了原子以包括 i
,这是解析 inf 所必需的)。