#c #локаль
Интересно почему сразу заканчивается выполнение программы при попытке ввода дробных чисел с точкой, а не с запятой, хотя в самом коде используются точки? Не оставляю кода потому что считаю это бессмысленно? Кто-то может мне разъяснить этот вопрос?
Ответы
Ответ 1
На самом деле многие библиотечные функции используют текущую локаль. В частности, от текущей локали зависит, какой разделитель целой и дробной части ожидают увидеть функции. При запуске программа наследует системную локаль, похоже в вашем случае это русская локаль. В качестве демонстрации приведу программу: #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("\n"); } void locale_info() { printf("Current locale: %s\n", setlocale(LC_NUMERIC, NULL)); printf("Current delimiter: '%s'\n", 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");
Комментариев нет:
Отправить комментарий