0
char again;
do {
            counter = 0;
            while (counter < 3) {
               printf("Please enter a number: ");
               scanf("%d", &num);
               counter++;
               sum += num;
            }
            if (counter == 3) {
                printf("Would you like to continue? [Y]Yes [N]No:");
                scanf("%c", &again);
            } 
        }while (again == 'Y');

なぜこれがうまくいかないのか理解できないようです。Yと入力すると壊れ、Nと入力すると壊れます。ユーザーが「N」を入力してプログラムを終了し、他の文字がなくなるまでループする必要があります。

4

2 に答える 2

8

scanf呼び出しを次のように変更します。

scanf(" %c", &again);

トリックは、:の前のスペースにあります。これは、NまたはYを返す前に空白文字を無視するように関数に%c指示します。それ以外の場合は、前の呼び出しからのリターンキャリッジを読み取ります。scanfscanf

From man 3p scanf(POSIX one):

1つ以上の空白文字で構成されるディレクティブは、有効な入力が読み取れなくなるまで、または空白文字ではない最初のバイトまで、未読のまま入力を読み取ることによって実行されます。

それは複雑な機能です。マニュアルページを注意深く読むことをお勧めします。ほとんどの人が思っているよりもはるかに多くのことができます。

于 2012-09-28T22:42:11.847 に答える
0

問題は、scanf("%c", &again)読み取りが最後の番号の後に改行を読み取ることです。これが、ループが常に中断する理由です。それはまた人々がプラスscanf()を支持して避けている理由でもあります; あなたはより良い診断とこのような厄介な落とし穴を少なくする傾向があります。fgets()sscanf()

これを自分でどのようにデバッグできたでしょうか。

読み取られたときに読み取られたデータを印刷することもできます—追加:

printf("Read: %d\n", again);

scanf()。また、各scanf()呼び出しをチェックして、期待するデータを取得していることを確認する必要があります。

if (scanf("%c", &again) != 1)
    ...oops — error handling...
于 2012-09-28T22:42:45.160 に答える