Имеется код:
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'. Однако при неверном вводе не происходит рекурсия. В чём проблема?
Ответ
Вообще-то это - cin.ignore(INT_MAX); - игнорировать все (ну ладно, INT_MAX символов) до конца файла - т.е. пока какое-то ^Z не закроет поток...
input.ignore(std::numeric_limits
');
И вообще, я бы делал так (если уж приспичила именно рекурсия):
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,'
');
cout << "Wrong values!
";
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,'
');
cout << "Wrong values!
";
}
}
Комментариев нет:
Отправить комментарий