0

私は非常に単純なコード セグメントを持っています。ここには、次のようなスイッチ ケースを含む do while ループがあります。

do {
    printf("Enter Choice\n");
    scanf("%d", &choice);
    switch(choice) {
          case 1: printf("1 selected");
                  break;
          case 2: printf("exit");
                  break;
          default: printf("wrong input");
                  break;
    }
} while (choice != 2);

このコードでは、誤って数字の代わりに文字を入力すると、プログラムは無期限にループし、入力さえ受け付けません。挿入すればこれを修正できることを知っています

if(isdigit(choice))

スイッチケースに入る前。しかし、私の質問は、そもそもなぜそれが起こるのかということです。

デフォルトのケースに移動して、再度入力を求めるべきではありませんか?

4

3 に答える 3

5

入力をフォーマット指定子と一致させることができない場合scanf、それはバッファに残されます。そのため、次回はまだ一致しません。つまり、食べきれないものは食べません。scanfによって返される値(一致した項目の数) をチェックして、入力が予期されたものであることを確認する必要があります。

または、不要なものをスキップするには、次のことを試してください (未テスト):

scanf("%*[^0-9]%d", &choice);

これにより、10 進数の整数を読み取ろうとする前に、数字ではないものはすべて破棄されます。

于 2012-08-10T10:22:36.757 に答える
1

scanfのマニュアル ページを参照してください。

この場合、入力の次のものが数値でない場合、それは消費されません。

からの戻り値を確認する必要がありscanf、それがゼロの場合は、次の文字を消費して再試行します (または、行末に到達するまで)。

于 2012-08-10T10:24:22.477 に答える