Зачем в коде нужна строчка? C++

Есть вот такой код. Немного непонятно, что делает второй цикл while. Да и правильно ли в целом написан код? Когда я ввожу цифры программа игнорируют оба цикла while, заносит их в массив и переходит к следующий интерации for. Но что будет, если я введу символы с клавиатуры? Символы запишутся в массив или благодаря циклам произойдет очистка этого массива,а потом я смогу снова ввести цифры с клавиатуры и уже они запишутся в массив? Поясните пожалуйста

#include <iostream>
const int Max = 5;
int main()
{
    using namespace std;

    int golf[Max];
    cout << "Please enter your golf scores.\n";
    cout << "You must enter " << Max << " rounds.\n";
    int i;
    for (i = 0; i < Max; i++)
    {
        cout << "round #" << i+1 << ": ";
        while (!(cin >> golf[i])) {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            cout << "Please enter a number: ";
        }
    }

    double total = 0.0;
    for (i = 0; i < Max; i++)
        total += golf[i];

    cout << total / Max << " = average score "
            << Max << " rounds\n";
 
    return 0; 
}

Ответы (1 шт):

Автор решения: EOF

Вот в этой строке кода

cin >> golf[i]

идёт считывание целого числа. Что будет, если мы введем не число, а слово? Например ten? cin увидит, что в вводе содержится не число и он прекратит считывание и заблокирует последующие попытки ввода (вместе с тем установит флаг ошибки и обнулит golf[i]). Чтобы преодалеть это, нам необходимо сделать следующие вещи:

  1. Сбросить флаг ошибки. Это делает строка cin.clear();. Это позволит нам снова получать ввод.
  2. После того, как сбросили флаг, в буфере ввода остался старый ввод, который и привел к ошибке. Чтобы убрать его, необходми считать из буфера всё до конца строки. Т.е. до нажатия Enter (что является символом новой строки ('\n')). Вот это и делает внутренний цикл while. Он извлекает из буфера по одному символу, пока не наткнётся на '\n'. После этого буфер будет пуст и можно будет снова ввести число.

Стоит ещё сказать, что выражение cin >> golf[i] возвращает обьект cin, который может быть преобразован в bool (true - ошибок нет, false - ошибки есть). Поэтому считывание числа находится в условии цикла. А оператор ! инверсирует значение. Т.е. внешний while выполнится тогда, когда возникнет ошибка ввода.
P.S. Вообще, внутренний while можно заменить строкой

cin.ignore(numeric_limit<streamsize>::max(), '\n');
→ Ссылка