Помогите написать исключение только для целых чисел C++

Мой код в с++. Я не знаю что можно сделать чтобы этот фрагмент кода ловил все вводы вместо цифр как запрещённые и переводил к разделу "else". Я также хочу чтобы инструкция к фильтровщику влезла внутри данных скобок.

///Tic Tac Toe
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;

#define COMPUTER 1
#define HUMAN 2

#define SIDE 3 // Length of the board

// Computer will move with 'O'
// and human with 'X'
#define COMPUTERMOVE 'O'
#define HUMANMOVE 'X'

// A function to show the current board status
void showBoard(char board[][SIDE])
{
    printf("\n\n");

    printf("\t\t\t %c | %c | %c \n", board[0][0],
        board[0][1], board[0][2]);
    printf("\t\t\t--------------\n");
    printf("\t\t\t %c | %c | %c \n", board[1][0],
        board[1][1], board[1][2]);
    printf("\t\t\t--------------\n");
    printf("\t\t\t %c | %c | %c \n\n", board[2][0],
        board[2][1], board[2][2]);

    return;
}

// A function to show the instructions
void showInstructions()
{
    printf("\t\t\t Tic-Tac-Toe\n\n");
    printf("Choose a cell numbered from 1 to 9 as below"
        " and play\n\n");

    printf("\t\t\t 1 | 2 | 3 \n");
    printf("\t\t\t--------------\n");
    printf("\t\t\t 4 | 5 | 6 \n");
    printf("\t\t\t--------------\n");
    printf("\t\t\t 7 | 8 | 9 \n\n");

    printf("-\t-\t-\t-\t-\t-\t-\t-\t-\t-\n\n");

    return;
}


// A function to initialise the game
void initialise(char board[][SIDE], int moves[])
{
    // Initiate the random number generator so that
    // the same configuration doesn't arises
    srand(time(NULL));

    // Initially the board is empty
    for (int i = 0; i < SIDE; i++)
    {
        for (int j = 0; j < SIDE; j++)
            board[i][j] = ' ';
    }

    // Fill the moves with numbers
    for (int i = 0; i < SIDE * SIDE; i++)
        moves[i] = i;

    // randomise the moves
    random_shuffle(moves, moves + SIDE * SIDE);

    return;
}

// A function to declare the winner of the game
void declareWinner(int whoseTurn)
{
    if (whoseTurn == COMPUTER)
        printf("COMPUTER has won\n");
    else
        printf("HUMAN has won\n");
    return;
}

// A function that returns true if any of the row
// is crossed with the same player's move
bool rowCrossed(char board[][SIDE])
{
    for (int i = 0; i < SIDE; i++)
    {
        if (board[i][0] == board[i][1] &&
            board[i][1] == board[i][2] &&
            board[i][0] != ' ')
            return (true);
    }
    return(false);
}

// A function that returns true if any of the column
// is crossed with the same player's move
bool columnCrossed(char board[][SIDE])
{
    for (int i = 0; i < SIDE; i++)
    {
        if (board[0][i] == board[1][i] &&
            board[1][i] == board[2][i] &&
            board[0][i] != ' ')
            return (true);
    }
    return(false);
}

// A function that returns true if any of the diagonal
// is crossed with the same player's move
bool diagonalCrossed(char board[][SIDE])
{
    if (board[0][0] == board[1][1] &&
        board[1][1] == board[2][2] &&
        board[0][0] != ' ')
        return(true);

    if (board[0][2] == board[1][1] &&
        board[1][1] == board[2][0] &&
        board[0][2] != ' ')
        return(true);

    return(false);
}

// A function that returns true if the game is over
// else it returns a false
bool gameOver(char board[][SIDE])
{
    return(rowCrossed(board) || columnCrossed(board)
        || diagonalCrossed(board));
}

// A function to play Tic-Tac-Toe
void playTicTacToe(int whoseTurn)
{
    // A 3*3 Tic-Tac-Toe board for playing
    char board[SIDE][SIDE];

    int moves[SIDE * SIDE];

    // Initialise the game
    initialise(board, moves);

    // Show the instructions before playing
    showInstructions();

    int moveIndex = 0, x, y;

    // Declare Human Input Value: cellNumber
    int cellNumber;

    // Keep playing till the game is over or it is a draw
    while (gameOver(board) == false && moveIndex != SIDE * SIDE)
    {
        if (whoseTurn == COMPUTER)
        {
            x = moves[moveIndex] / SIDE;
            y = moves[moveIndex] % SIDE;
            if (board[x][y] == ' ')
            {
                board[x][y] = COMPUTERMOVE;
                printf("COMPUTER has put a %c in cell %d\n", COMPUTERMOVE, moves[moveIndex] + 1);
                showBoard(board);
                moveIndex++;
                whoseTurn = HUMAN;
            }
            else
            {
                moveIndex++;
            }
        }
        else if (whoseTurn == HUMAN)
        {
            // Prompt the human for their move
            printf("Enter the cell number (1-9) where you want to place your move: ");
            scanf_s("%d", &cellNumber);
            cellNumber--;

            int x = cellNumber / SIDE;
            int y = cellNumber % SIDE;

            // Check if the selected cell is valid and available
            if (x >= 0 && x < SIDE && y >= 0 && y < SIDE && board[x][y] == ' ')
            {
                board[x][y] = HUMANMOVE;
                printf("HUMAN has put a %c in cell %d\n", HUMANMOVE, cellNumber + 1);
                showBoard(board);
                moveIndex++;
                whoseTurn = COMPUTER;
            }
            else
            {
                printf("Invalid move. Please try again.\n");
            }
        }
    }

    // (isdigit(x)) && (isdigit(y)) && 
    // If the game has drawn
    if (gameOver(board) == false &&
        moveIndex == SIDE * SIDE)
        printf("It's a draw\n");
    else
    {
        // Toggling the user to declare the actual
        // winner
        if (whoseTurn == COMPUTER)
            whoseTurn = HUMAN;
        else if (whoseTurn == HUMAN)
            whoseTurn = COMPUTER;

        // Declare the winner
        declareWinner(whoseTurn);
    }
    return;
}

// Driver program
int main()
{
    // Let us play the game with COMPUTER starting first
    playTicTacToe(COMPUTER);

    return (0);
}
while (gameOver(board) == false && moveIndex != SIDE * SIDE)
{
    if (whoseTurn == COMPUTER)
    {
        // CPU
    }
    else if (whoseTurn == HUMAN)
    {
        // Prompt the human for their move
        printf("Enter the cell number (1-9) where you want to place your move: ");
        scanf_s("%d", &cellNumber);
        cellNumber--;

        int x = cellNumber / SIDE;
        int y = cellNumber % SIDE;

        // Check if the selected cell is valid and available
        if (x >= 0 && x < SIDE && y >= 0 && y < SIDE && board[x][y] == ' ')
        {
            board[x][y] = HUMANMOVE;
            printf("HUMAN has put a %c in cell %d\n", HUMANMOVE, cellNumber + 1);
            showBoard(board);
            moveIndex++;
            whoseTurn = COMPUTER;
        }
        else
        {
            printf("Invalid move.\n");
        }
    }
}

if (x >= 0 && x < SIDE && y >= 0 && y < SIDE && board[x][y] == ' ') Спасибо тем кто подсказал по поводу обозначения ';'. Теперь по вопрос. В приведённой строке надо вписать код который, проверяет что введённый тип данных это числа. Какими способами это лучше всего сделать? Пока код не исправлен любой случайный ввод в программу любого символа кроме целых чисел, заставляет программу быстро печатать два текста находящиеся в цикле внутри которого и лежит длинная строка "if" с круглыми скобками.


Ответы (1 шт):

Автор решения: NunOfIt

Можете попробовать вот так сканировать, посимвольно. И потом просто добавить условие, если результат 0, то давай досвидания...

#include <stdio.h>

bool isNumber(char c) { return c >= '0' && c <= '9'; }

int scan_number() {
    char c;
    int n, res = 0;
    bool key = false;

    n = scanf(" %c", &c);
    while(n && n != EOF && c != '\n') {
        if(isNumber(c)) {
            key = true;
            res *= 10;
            res += c - '0';
        }
        else if(key) { break; }
        n = scanf("%c", &c);
    }
    return res;
}

int main() {
    printf("Input: ");
    printf("%d\n", scan_number());
    return 0;
}
→ Ссылка