Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Запятые и точки в дробных числах в си при вводе чисел

Интересно почему сразу заканчивается выполнение программы при попытке ввода дробных чисел с точкой, а не с запятой, хотя в самом коде используются точки? Не оставляю кода потому что считаю это бессмысленно? Кто-то может мне разъяснить этот вопрос?


Ответ

На самом деле многие библиотечные функции используют текущую локаль. В частности, от текущей локали зависит, какой разделитель целой и дробной части ожидают увидеть функции. При запуске программа наследует системную локаль, похоже в вашем случае это русская локаль. В качестве демонстрации приведу программу: #include #include #include #include
void test(const char* str) { printf("%s => ", str); char* endptr; double num = strtod(str, &endptr); // Checking if whole string parsed if (endptr != str + strlen(str)) { printf("ERROR"); } else { printf("%lf", num); } printf("
"); }
void locale_info() { printf("Current locale: %s
", setlocale(LC_NUMERIC, NULL)); printf("Current delimiter: '%s'
", localeconv()->decimal_point); }
int main() { const char* dot = "10.5"; const char* comma = "10,5"; setlocale(LC_ALL, "en_US.utf8"); locale_info(); test(dot); test(comma); setlocale(LC_ALL, "ru_RU.utf8"); locale_info(); test(dot); test(comma); } У меня программа выводит: Current locale: en_US.utf8 Current delimiter: '.' 10.5 => 10.500000 10,5 => ERROR Current locale: ru_RU.utf8 Current delimiter: ',' 10.5 => ERROR 10,5 => 10,500000 Видно, что в зависимости от локали, программа по разному интерпретирует одни и те же данные. Чтобы избежать таких неожиданностей, можно при запуске программы устанавливать стандартную локаль для числовых данных: setlocale(LC_NUMERIC, "C");

Комментариев нет:

Отправить комментарий