Почему этот поток строк терпит неудачу при разборе в 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"
, оба из которых должны дать мне двойное значение: 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
Edit2:
Это ошибка в libC++ или спецификация просто расплывчата в отношении того, что считается допустимым синтаксическим анализом для double?
1 ответ
Это ошибка в libC++. В соответствии с пулом [facet.num.get.virtuals] 3.2 символ должен накапливаться только в том случае, если он разрешен в качестве следующего символа поля ввода спецификатора преобразования, определенного на этапе 1 (%g
за double
). Накопив 1
, i
не допускается, поэтому этап 2 следует прекратить.
libC++ накапливает символы без разбора, пока не достигнет неатомного символа (он также расширил атомы для включения i
, который требуется для разбора инф).