strtod усекает десятичные дроби при использовании в проекте Qt - PullRequest
3 голосов
/ 07 сентября 2011

В настоящее время я отлаживаю код, который иногда работает, а иногда нет. Это загрузчик файлов OBJ, и я нашел часть, которая создает проблемы:

double val = strtod(str, &endptr);

Чтобы объяснить проблему, я приведу пример значений после вызова strtod.

str = "-0.021344"
val = -0
*endptr = '.'

За этой строкой выполняется проверка ошибок и, если *endptr != '\0', выдается ошибка. Теперь, конечно, выдается ошибка, потому что strtod помечает точку как конец числа, но почему это так? Также обратите внимание, что эта ошибка возникает только при использовании кода в проектах QT.

Спасибо за ваши идеи.

Ответы [ 3 ]

7 голосов
/ 07 сентября 2011

Возможно, вы используете locale , для которого десятичная точка не равна .. Попробуйте setlocale(LC_NUMERIC, "C"); перед оператором strtod.

Примечание: я не знаю, как локаль и QT ведут себя вместе. Вы можете сохранить и восстановить локаль ...

char *saved_locale;
saved_locale = setlocale(LC_NUMERIC, "C");
/* do your strtod thing */
setlocale(LC_NUMERIC, saved_locale);
4 голосов
/ 07 сентября 2011

Все функции C, работающие с текстовыми представлениями, зависят от локали.

Какая у вас локаль? В некоторых случаях десятичная точка на самом деле ,.

1 голос
/ 07 сентября 2011

Десятичная точка зависит от локали.

С руководство :

A десятичное число состоит из непустой последовательности десятичных цифр, возможно содержащих радикальный символ (десятичная точка, зависит от локали, обычно ''. ''), За которым может следовать десятичная дробь. Десятичный показатель состоит из '' E '' или '' e '', за которым следует необязательный знак плюс или минус, за которым следует непустая последовательность десятичных цифр, и указывает умножение на степень 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...