Если заявление не работает в моем коде
//a является целым числом, но если во время выполнения нажимается алфавит, код продолжает работать без какого-либо ввода, вместо этого показывается неверный вывод и повторяется оборот цикла снова.
for (int j = 0; j <= 8; j++)
{
if (j % 2 == 0){
boad(arr);
cout << "Player 1's turn " << endl << "Enter your position :";
cin >> a;
if (a == 0 || a == 1 || a == 2 || a == 3 || a == 4 || a == 5 || a == 6 || a == 7 || a == 8)
{
arr[a] = 'O';
check(arr);
}
else
{
cout << "invalid output";
j = j - 1;
}
}
}
1 ответ
Входной поток продолжает пытаться прочитать любое число, и если не удается, он устанавливает ios::failbit
бит (который является флагом, который указывает, что ваше чтение не удалось). Чтобы вы могли проверить cin.fail()
это проверяет failbit
,
if (cin.fail()) {
cout << "Invalid input\n";
} else {
cout << a << "\n";
}
Если вы сделаете это, когда вы введете символ, он сохранит запись Invalid input
, потому что он все еще пытается прочитать число, и у вас есть письмо.
Итак, чтобы поток прочитал строку, затем вы извлекаете из нее число, используйте std::getline
, std::string
, std::stringstream
, Как это:
for(int i = 0; i < 4; i++) {
std::string str; // Create a string variable
std::getline(cin, str); // Read a line, regardless of its components
std::stringstream s(str); // Create a stream from this line
s >> a; // Try to read an integer from this stream (which expresses the line)
if (s.fail()) {
std::cout << "Invalid input\n";
} else {
std::cout << a << "\n";
}
}