0

プログラムを開始すると、最初のprintfステートメントを実行することから始め、次に入力すると、2つの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;
}
4

2 に答える 2

2

最初getchar()は入力ストリームに改行文字を残し、後続の によって消費されるためgetchar()です。1 つの方法は、別の 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
于 2013-04-20T05:24:03.040 に答える
2

おそらく getchar(); から '\n' 文字を取得しています。

次のようなことができます。

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

次の getchar() で再度読み取る前に、標準入力をクリアします。

于 2013-04-20T05:28:53.643 に答える