2013-04-20 2 views
0

Почему, когда я запускаю программу, я начну с выполнения первого оператора printf, а затем ввода i, тогда он одновременно выполнит два оператора printf. Это то, что вызывает бесконечный цикл?Почему мой оператор printf появляется одновременно? и получить бесконечный цикл?

Запуск программы

Player 1: Choose your symbol: 
    a 

Эта часть, они оба вывода одновременно

Player 2: Choose your symbol: 
player1, enter placement: 

И тогда я получаю бесконечный цикл. Это связано с одновременным выходом?

код

include <stdio.h> 
int check(char player); 
void move(char player); 
char board[3][3] ; 



int main(void) 
{ 
int first; 
char player1, player2; 

     printf("Player 1: Choose your symbol: \n"); 
     player1 = getchar(); 

     printf("Player 2: Choose your symbol: \n"); 
     player2 = getchar(); 




int i=0; 
int win;char turn; 
while(win == 0) 
{ 
     if((i%2) == 0){ 
       turn = player1; 
       move(player1); 
       win = check(player1); 
       print();} 
     else { 
       turn = player2; 
       move(player2); 
       win = check(player2); 
       print();} 
     i++; 
} 

     if (i == 8) 
       printf("its a tie"); 
     else 
       printf("the winner is %c", turn); 

return 0; 
} 
/*printing the board that takes in a placement int*/ 
void print(void) 
{ 
     int r; 
     printf("\n"); 
     for (r = 0; r < 3; r++){ 
       printf(" %c | %c | %c \n" , board[r][0], board[r][2], board[r][3]); 
     if (r != 2) 
       printf("___________\n"); 
     } 
     printf("\n"); 
return; 
} 
/*check to see if someone won*/ 
int check(char player) 
{ 
    int r, c; 

    for (r = 0 ; r <3 ; r++) 
    { 
     if ((board[r][0] == player) && (board[r][1] == player) && (board[r][2] == player)) 
      return 1; 
    } 

    for (c = 0 ; c <3 ; c++) 
    { 
     if ((board[0][c] == player) && (board[1][c] == player) && (board[2][c] == player)) 
      return 1; 
    } 

    if((board[0][0] == player) && (board[1][1] == player) && (board[2][2] == player)) 
     return 1; 

    if((board[0][2] == player) && (board[1][1] == player) && (board[2][0] == player)) 
     return 1; 

    return 0; 
} 

void move(char player) 
{ 
    int place; 
    printf("player1, enter placement: \n"); 
    scanf("%d", &place); 

    if (place == 1) 
     board[0][0] = player; 
    else if (place == 2) 
     board[0][1] = player; 
    else if (place == 3) 
     board[0][2] = player; 

    else if (place == 4) 
     board[1][0] = player; 
    else if (place == 5) 
     board[1][1] = player; 
    else if (place == 6) 
     board[1][2] = player; 

    else if (place == 7) 
     board[2][0] = player; 
    else if (place == 8) 
     board[2][1] = player; 
    else if (place == 9) 
     board[2][2] = player; 
} 
+0

Вы не инициализируете переменную 'win'? Все еще работает? – iCode

+0

@ Шихи ОП повезло. – 2013-04-20 05:30:04

ответ

2

Поскольку первый getchar() оставляет символ новой строки во входном потоке, который потребленный последующего getchar(). Один из способов - использовать другой getchar() для использования нежелательных символов новой строки.

printf("Player 1: Choose your symbol: \n"); 
    player1 = getchar(); 
    getchar(); // consume a newline 

    printf("Player 2: Choose your symbol: \n"); 
    player2 = getchar(); 
    getchar(); // consume a newline 
2

Возможно, вы получаете символ '\ n' от getchar();

Вы могли бы сделать что-то вроде:

printf("Player 2: Choose your symbol: \n"); 
player2 = getchar(); 
while (player2 != '\n') { player2 = getchar(); } 

очистить стандартный ввод, прежде чем снова чтение со следующего GetChar();

Смежные вопросы