Не выполняется рекурсия

208
25 октября 2017, 06:00

Имеется код:

char field[3][3];
void enterX() {
            cout << "Enter X on vertical: ";
            int i;
            cin >> i;
            if (cin.good() && i < 3 && i >= 0)
            {
            }
            else {
                cout << "Please, enter the number 0-2!";
                cin.clear();
                cin.ignore(INT_MAX);
                enterX();
            }

            cout << "Enter X on horizontal: ";
            int j;
            cin >> j;
            if (cin.good() && j < 3 && j >= 0) {
            }
            else {
                cout << "Please, enter the number 0-2!";
                cin.clear();
                cin.ignore(INT_MAX);
                enterX();
            }
            field[i][j] = 'x';
    }

Задача - считывание номера элемента массива с консоли и вставке в это место символа 'x'. Однако при неверном вводе не происходит рекурсия. В чём проблема?

Answer 1

Вообще-то это - cin.ignore(INT_MAX); - игнорировать все (ну ладно, INT_MAX символов) до конца файла - т.е. пока какое-то ^Z не закроет поток...

input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

И вообще, я бы делал так (если уж приспичила именно рекурсия):

char field[3][3];
void enterX() {
    cout << "Enter X && Y: ";
    unsigned int i, j;
    cin >> i >> j;
    if (cin.fail() || i > 2 || j > 2)
    {
        cin.clear();
        cin.ignore(INT_MAX,'\n');
        cout << "Wrong values!\n";
        enterX();
    }
    else
    {
        field[i][j] = 'x';
    }
}

Update

Имея типичную оконечную рекурсию, лучше переделать ее в итерацию:

char field[3][3];
void enterX()
{
    for(;;)
    {
        cout << "Enter X && Y: ";
        unsigned int i, j;
        cin >> i >> j;
        if (!(cin.fail() || i > 2 || j > 2))
        {
            field[i][j] = 'x';
            break;
        }
        cin.clear();
        cin.ignore(INT_MAX,'\n');
        cout << "Wrong values!\n";
    }
}
READ ALSO
Потерялся 1 бит в long double

Потерялся 1 бит в long double

По следам вопроса о битовом представлении вещественных чисел и моего ответа на него

226
set и unordered_set

set и unordered_set

Все мы знаем, что std::set - это красно-чёрное дерево (соответственно со сложностью поиска O(log n)), а std::unordered_set - хэш-таблица с поиском за константуКакие...

257
Увеличение времени исполнения кода

Увеличение времени исполнения кода

Столкнулся со следующей проблемой: Есть код, написанный не одним человеком, который работает с использованием MPIВ части последовательного...

204
Высвобождение памяти

Высвобождение памяти

Не могу найти где забываю высвободить памятьПодскажите,пожалуйста

256