2

以下のコードで問題が発生します。任意の整数、つまりを入力すると(0-9)、OKです。しかし、のような他の文字を入力するとAB他の文字scanf()は失敗します。その後、それ以上の入力を待ちません。

このためのコードスニペットを添付しました。C標準ライブラリのみを使用したエラー処理が非常に必要です。

#include <stdio.h>

int main()
{
    int choice;
    while(1)
    {
        printf("Enter your choice: ");
        if(0 == scanf("%d", &choice))
          {
              printf("Some error occured\n");
              //break;/*I did not want to break this loop as I use this to show menu*/
          }

        switch(choice)
         {
                      case 0:printf("Case 0\n");break;
                      case 1:printf("Case 1\n");break;
                      case 2:printf("Case 2\n");break;
                      case 3:printf("Case 3\n");break;
                      case 4:printf("Case 4\n");break;
                      case 5:printf("Case 5\n");break;
                      case 6:printf("Case 6\n");break;
                      case 7:printf("Case 7\n");break;
                      case 8:printf("Case 8\n");break;
                      case 9:printf("Case 9\n");break;
                      default:printf("Default case\n");break;

         }
    }
}

より明確な質問は、なぜ失敗した後も待たないのかということです。

4

2 に答える 2

4

を使用scanfすると、指定された入力がフォーマット仕様と一致しない場合、入力は消費されず、入力バッファーに残ります。つまり、一致しない文字は読み取られません。

したがって、たとえば文字を入力すると、同じ文字で失敗し続けるためa、コードは無期限にループします。scanf

エラーが返された場合scanfは、問題のある文字を取り除く必要があります。

入力される文字数はわかりませんが、問題のある文字を消費する簡単な方法の1つは、scanfが失敗したときに文字列を読み取ろうとすることです。

char junkChars[256];

printf("Enter your choice: ");
if (scanf("%d", &choice) == 0)
{
    printf("Some error occured\n");
    scanf("%s", junkChars);
}

これにより入力バッファがクリアされますが、上限に依存します。ユーザーが256文字を超えscanf入力した場合、は次の反復でそれらを消費し続けます。

明らかにこれは醜い解決策ですが、scanfこの理由から実際には優れた入力メカニズムではありません。fgets入力行を文字列として取得し、その文字列の解析を自分で制御するために使用することをお勧めします。

于 2012-08-04T02:25:28.320 に答える
1

これは仕様によるものです。

breakは使用せず、continueを使用してください。

于 2012-08-04T02:23:51.477 に答える