Почему этот поток строк терпит неудачу при разборе в double? - PullRequest
0 голосов
/ 28 октября 2018

У меня есть следующий код:

#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 Ответ

0 голосов
/ 28 октября 2018

Это ошибка libc ++ . В пуле [facet.num.get.virtuals] 3.2 символ должен накапливаться, только если он разрешен в качестве следующего символа поля ввода спецификатора преобразования, определенного на этапе 1 (%g за double). Накопив 1, i не допускается, поэтому этап 2 должен завершиться.

libc ++ накапливает символы без разбора до тех пор, пока не достигнет неатомного символа (он также расширил атомы до i, который необходим для анализа inf).

...