Это, скорее всего, потому что у вас есть какой-то локали, где десятичным разделителем является ,
вместо .
, и так как вы, вероятно, не проверяя возвращаемое значение scanf()
«который является то, что большинство книг и почти каждый учебник» , то переменная не инициализируется, а то, что вы печатаете, является следствием компоновки вашей программы вместо значения, введенного пользователем.
Чтобы проверить, что я говорю, я предлагаю скомпилировать одну и ту же программу без изменений, но с разными флагами компиляции.
Что вы должны сделать, это убедиться, что вход является правильным, попробуйте это
float GetFloat(int *ok)
{
float value = 0;
if (scanf("%f", &value) != 1)
*ok = 0;
else
*ok = 1;
return value;
}
, который вы назвали бы как этот
int result = 0;
float change = GetFloat(&result);
if (result == 0)
return -1;
float cents = round(change * 100);
printf("Cents is %f",cents);
Если десятичный разделитель является проблемой, выше программа будет не выводит ничего, потому что scanf()
вернет 0
, и, следовательно, ok
будет 0
после вызова функции.
Одним из важных последствий игнорирования возвращаемого значения функций не void
является то, что если значение не было инициализировано, как в этом случае, с scanf()
, и вы не знаете, что, поскольку вы не проверили возвращаемое значение, не определено поведение, что означает, что ваша программа будет содержать ошибки, которые очень трудно найти и, следовательно, очень трудно исправить.
Пожалуйста, покажите 'GetFloat()'. _ и иногда остерегайтесь математики с плавающей запятой. :-) –
Каковы настройки локали в ваших os? –
Да, пожалуйста, отредактируйте свой вопрос и добавьте функцию GetFloat() – Noober