Функция strtod() считывает только целую часть вещественного числа

167
19 августа 2018, 05:10

Использую inih для парсинга ini файла. Обнаружилось то, что функция INIReader::GetReal(...) возвращает только целую часть вещественного числа. В комментариях написан пример значений переменных при отладке.

double INIReader::GetReal(const string& section, const string& name, double default_value) const
{
    string valstr = Get(section, name, ""); // "1.033"
    const char* value = valstr.c_str(); // "1.033"
    char* end; // ".033"
    double n = std::strtod(value, &end); // 1
    return end > value ? n : default_value;
}

github code function

Компилятор:

gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Answer 1

Функция strtod использует системно-зависимое значение символа разделителя дробной и целой части (decimal separator). И если в системе текущим разделителем является запятая (что характерно для русской локали), функция не сможет правильно распарсить строку, в которой в качестве разделителя использовалась точка. Именно это и происходят в вашем случае.

В качестве решения проблемы можно посоветовать использовать функцию strtod_l (_strtod_l для Windows) которая принимает третьим параметром локаль с правильным (ожидаемым) разделителем или можно взять готовую обёртку strtod (тут или тут) которая парсит вещественные числа с предположением, что разделителем является точка, вне зависимости от значения локали.

READ ALSO
Невозможно открыть вторую форму в Qt

Невозможно открыть вторую форму в Qt

При переходе на другую форму в Qt у меня возникает ошибка:

156
Правильная архитектура калькулятора

Правильная архитектура калькулятора

есть четыре поля, два любых заполняет пользователь, слушатель наблюдает за заполнением полей, два считаются на их основе по команде слушателяВопрос...

149
Создание плагинов log4j

Создание плагинов log4j

Пытаюсь написать свой LayoutПишу простейший класс

203
Ошибка java.lang.ArrayIndexOutOfBoundsException: 1

Ошибка java.lang.ArrayIndexOutOfBoundsException: 1

При проходе по этой части кода возникает ошибкаВсё хорошо считывается при проходе первого фрагмента, дальше же возникает ошибка, возможно...

128