Я получил что-то вроде этого:
#include <iostream>
#include <limits>
#include <string>
using namespace std;
template<class T> T getValue(const string& name)
{
T ret;
while(!(cin >> ret))
{
// normally here you'd go into an infinite loop, but since you're going to ignore the rest of the line, you can ensure that you won't go into an infinite loop and you can re-ask the user to input the correct data
cout << "Invalid input for " << name << " please try again" << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
return ret;
}
int main(void)
{
bool valid = false;
char row, orientation;
int column;
do {
cout << "Enter row, column, and orientation (<A-P> <1-15> <H to V>): " << endl;
row = getValue<char>("row");
column = getValue<int>("column");
orientation = getValue<char>("orientation");
if(row<'A' || row>'P')
cout << "Invalid row please enter A-P" << endl;
else if(column<1 || column>15)
cout << "Invalid column please enter 1-15" << endl;
else if(orientation<'H' || orientation>'V')
cout << "Invalid orientation please enter H-V" << endl;
else
valid = true;
} while(!valid);
cout << "Row: " << row << endl
<< "Column: " << column << endl
<< "Orientation: " << orientation << endl;
return 0;
}
Конечно, если вы введете что-то недопустимое, например:
A B C
Это могло бы вызвать некоторые потенциально запутанные проблемы. Первый A будет успешно скопирован в переменную char строки. Однако, поскольку B не является числовым, он игнорирует оставшийся буфер, поэтому вы теряете B и C. Вы получаете сообщение об ошибке, что вы ввели неверный ввод для столбца, но как только вы успешно введете действительное число, вам все равно придется ввести ориентация снова. Таким образом, пользователь не имеет четкого представления об этом на основе этого приложения. Вы можете легко внести такие изменения, чтобы, если вы введете неверный ввод, вам будет предложено ввести все это.