При вводе 2.6 первый scanf
прочитает 2 и оставит .6 во входном потоке.
Следующее scanf
увидит. , который нельзя преобразовать в целое число.Следовательно, scanf
возвращается и оставляет goals[i]
неинициализированным.Входной поток будет по-прежнему содержать .6 , так что точно так же происходит снова и снова в цикле.
Затем вы используете неинициализированную переменную (и) для вычисления среднего и, следовательно, в конечном итогес "странными" значениями.Примечание. Использование неинициализированных переменных - неопределенное поведение.
Обратите внимание, что проблема не имеет ничего общего с float .Проблема в том, что входные данные содержат символ, который не может быть преобразован в целое число.Ввод, например 2HelloWorld6 , даст вам тот же результат.
Вам необходимо проверить значение, возвращаемое scanf
, например:
if (scanf(" %d", &goals[i]) != 1)
{
// Ups - could not scan an integer
... add error handling here ...
}
КСТАТИ: Рассмотрим чтение ввода пользователем сfgets
и выполните сканирование с помощью sscanf
.В большинстве случаев это намного проще, чем использовать scanf
, потому что вы не окажетесь в ситуации, когда какой-либо символ застрянет во входном потоке.