3

問題の while ループと switch は次のとおりです (track1 は、ここには示されていないより大きなループを定義します)。

while (track6 ==1)
    {
    printf ("would you like to play again? Y or N?\n");
    scanf ("%c", &response);

        switch (response)
            {
            case 'Y' : track6 = 2; 
                break;
            case 'N' : printf ("thanks for playing!\n");
                            track6 = 2, track1 = 2;
                break;
                    default : printf ("response is case-sensitive and must be either Y or N. your response is invalid. please reenter.\n");
            }
    }

私が受け取る出力は次のとおりです。

would you like to play again? Y or N?

response is case-sensitive and must be either Y or N. your response is invalid. please  reenter.

would you like to play again? Y or N?

(入力を求めてから正しく実行されます)

最初のprintfを実行し、scanfをスキップし、デフォルトを実行し、ループの先頭に戻ってそこから適切に実行しているようです。理由はありますか?これは私の 3 週間目のプログラミングなので、素人の条件は大歓迎です。

4

4 に答える 4

2

scanf最初に入力して読み取るので問題だと思います-スペース文字を試してみるかgetchar()、追加してくださいscanf" %c"

scanf (" %c", &response);  
于 2013-10-05T08:43:31.670 に答える
1

scanf ("%c", &response);前の末尾の改行をスキップする必要がありますscanf

だから使用:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF); //eats '\n' 

scanf

于 2013-10-05T08:44:56.237 に答える
1

最初の を実行しprintf、 をスキップしscanf、デフォルトを実行し、ループの先頭に戻り、そこから適切に実行しているようです。理由はありますか?

いいえ。最初のprintfステートメントを実行し、前のステートメントによって残された改行 () 文字を読み取り\nscanf、ループの先頭に戻り、そこから適切に実行しているようです。この改行文字を食い尽くすための1つの可能な解決策は、変更することです

scanf ("%c", &response);

scanf (" %c", &response);  
        ^
        |
   add a space here to eat up '\n'  

Yただし、これは、ユーザーからの入力が または のいずれかである場合にのみ機能しますNYESユーザーがorNOを複数の文字 ( を除く) で入力した場合\n、プログラムを適切に実行するには、これらの余分な文字をすべて使用する必要があります。scanfこのために、 inの直後にループを使用しますwhile

 printf ("would you like to play again? Y or N?\n");
 scanf ("%c", &response);
 while ((response = getchar()) != '\n' && response != EOF) 
     ;
于 2013-10-05T08:43:17.370 に答える
0

scanf を使用して文字を入力する前に、入力バッファーをフラッシュする必要があります。

于 2013-10-05T09:49:21.300 に答える