Интересно почему сразу заканчивается выполнение программы при попытке ввода дробных чисел с точкой, а не с запятой, хотя в самом коде используются точки? Не оставляю кода потому что считаю это бессмысленно? Кто-то может мне разъяснить этот вопрос?
Ответ
На самом деле многие библиотечные функции используют текущую локаль. В частности, от текущей локали зависит, какой разделитель целой и дробной части ожидают увидеть функции. При запуске программа наследует системную локаль, похоже в вашем случае это русская локаль. В качестве демонстрации приведу программу:
#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");
Комментариев нет:
Отправить комментарий