символ, т.е. ‘a’ или любая другая буква, отличная от 0-9, программа бесконечно повторяет цикл

#c #input #infinite-loop

#c #ввод #бесконечный цикл

Вопрос:

Я новичок в программировании и играю в крестики-нолики на c. Моя проблема, как следует из названия, заключается в том, что когда я ввожу символ, т.Е. «a», отличный от целого числа, т.е. 0-9, программа бесконечно повторяет цикл while в main() или пока не достигнет временного предела, который я размещено без запроса пользовательского ввода. Я ни за что на свете не смогу понять, в чем дело.

 #include<stdio.h>

#define TRUE    1
#define FALSE   0

void greet_players();
void draw_grid(int loc, char cur_player, char point[]);
char swap_player(char *cur_player, int *is_turn);
int player_loc();
int check_win();

int main(){
    int i;
    int is_turn;
    int loc = 0;
    char point[9];
    char cur_player;

    
    greet_players(); //greet players.
    
    for(i = 0; i < 9; i  ){ point[i] = '_'; }// set the point array to '_'.

    int temp = 0;
    is_turn = TRUE;   // set the first turn to true.
    cur_player = 'X'; // set the first player before the grid is printed.
    
    while(/*!check_win()*/temp<3){ 
        swap_player(amp;cur_player, amp;is_turn); // change player for the next loop.
        if(is_turn == TRUE) { is_turn = FALSE; }
        draw_grid(loc, cur_player, point); 
        temp  ;
        
    };
    
    return 0;
}
/***************************************************************************/

// Function prints out a greeting to players.
void greet_players(){   
    puts("***********************************************************************************");
    puts("Hello this is tic tac toe.");
    puts("The rules are simple: ");
    puts("#1 two players each place their pieces (X,O) on a 9x9 grid.");
    puts("#2 when a player has placed three pieces either horizontal or vertical they win.");
    puts("#3 and thats it, have fun.");
    puts("***********************************************************************************n");
    // print the first grid empty
    puts("Tic_Tac_Toe.");
    puts("  |1|2|3|");
    puts("  |4|5|6|");
    puts("  |7|8|9|");
    puts("***********************************************************************************");
}
/***************************************************************************/

// Function draws grid.
void draw_grid(int loc, char cur_player, char point[]){
    int i, j, p;
    
    p = player_loc()-1;
    printf("%dn", p);
    puts("Tic_Tac_Toe.");
    if(point[p] == '_'){
        point[p] = cur_player;
        for(i = 0; i < 3; i  ){
            printf("  ");
            for(j = 0; j < 3; j  ){
                printf("|%c", point[loc]);
                loc  ;
            }
            puts("|");
        }
        puts("***********************************************************************************");
    }
    else{ puts("nSpace invalid,please choose an empty Location('_')."); }
}
/***************************************************************************/

// Function gets the current players inputed locition.
int player_loc(){
    int player_loc = 0;
    scanf(" %d", amp;player_loc);
    
    if(player_loc >= 1 amp;amp; player_loc <= 9 ){ return (player_loc); }
    else{ return (0); }
}
/***************************************************************************/

// Function changes player icon to the next icon when the current player inputs their location.
char swap_player(char *cur_player, int *is_turn){
    if(*cur_player == 'X' amp;amp; *is_turn == FALSE){ 
        *cur_player = 'O';
        *is_turn = TRUE;
    }
    if(*cur_player == 'O' amp;amp; *is_turn == FALSE){ 
        *cur_player = 'X';
        *is_turn = TRUE;
    }
    
    return (*cur_player);
}
/***************************************************************************/

int check_win(){ return (0); }
 

Комментарии:

1. Вы пытались отладить программу?

2. scanf(" %d", amp;player_loc); принимает только целые числа. Любой другой ввод будет проигнорирован и останется во входном потоке. Классический источник бесконечного цикла

3. Вы должны проверить возвращаемое значение вашего scanf() вызова в player_loc() . Если scanf() он возвращает ноль, это означает, что входные данные не соответствовали строке формата, и поэтому вы не можете полагаться на то, что значение в player_loc будет чем-то полезным или каким-либо образом отражает то, что было введено.