Как корректно проверить ввод на соответствие типу переменной?

В моей программе подразумевается проверка ввода на соответствие типу int, но при "ошибочном" вводе цикл крутится бесконечно и не даёт ввести новое значение:

#include <iostream>
#include <vector>

const int arr_size = 5;

using namespace std;

void fill_array(int arr[], int size);
void show_array(const int arr[], int size);
void revalue_array(int arr[], int size, float koef);

int main(void)
{
    int arri[5];
    fill_array(arri, arr_size);

    return 0;
}

void fill_array(int arr[], int size)
{
    int cost;
    for (int i = 0; i < size; i++)
    {
        cout << "Enter " << i + 1<< "st" << " cost: ";
        while (!(cin >> cost))
        {
            cin.clear();
            cout << "Bad input, please, enter a numder: ";
            cin >> cost;
            cout << endl;
            cout << cost << endl;
        }
        
    }
}

Можете, пожалуйста, объяснить причину некорректного поведения моей программы и сказать, что нужно сделать, чтобы она работала правильно?


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

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

Ошибка в том, что cin.clear() только очистит флаг ошибки, а ошибочное значение так и останется в буфере потока. Это значение можно "съесть" при помощи функции getline().

Исправленный код будет таким:

#include <iostream>
#include <vector>

const int arr_size = 5;

using namespace std;

void fill_array(int arr[], int size);
void show_array(const int arr[], int size);
void revalue_array(int arr[], int size, float koef);

int main(void)
{
    int arri[5];
    fill_array(arri, arr_size);

    return 0;
}

void fill_array(int arr[], int size)
{
    int cost;
    for (int i = 0; i < size; i++)
    {
        cout << "Enter " << i + 1<< "st" << " cost: ";
    
        cin >> cost;
        while (cin.fail())
        {
            string str;
            cin.clear();
            getline(cin, str, '\n');
            cout << "Bad input, please, enter a numder: ";
            cin >> cost;
        }
        cout<<endl;
    }
}
→ Ссылка