#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 будет чем-то полезным или каким-либо образом отражает то, что было введено.