Если заявление не работает в моем коде

//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";
    }
}
Другие вопросы по тегам