2017-03-13 8 views
0

私は以下のような単純なメニュー駆動のCコードでエラーチェックを強化する方法を見つけ出すのに苦労しています。コードは適切な入力でうまく動作しますが、残念ながら引数が間違っていると無限ループになります。誰かが私にこの事件を手伝ってもらえますか?メニュー駆動型プログラムは無限ループで終わります

#include<stdio.h> 

int main() 
{ 
    int choice, num, i; 
    unsigned long int fact; 
    system("clear"); 
    do 
    { 
     printf("1.Factorial\n"); 
     printf("2.Prime\n"); 
     printf("3.Odd/Even\n"); 
     printf("4.Exit\n"); 
     printf("\nYour choice?"); 
     scanf("%d",&choice); 
     switch(choice) 
     { 
     case 1: 
      printf("\nEnter number:"); 
      scanf("%d",&num); 
      fact = 1; 
      for(i=l;i<=num;i++) 
       fact=fact*i; 
      printf("\n Factorial value=%lu\n",fact); 
      break; 
     case 2: 
      printf("\n Enter number:"); 
      scanf("%d",&num); 
      for(i=2;i<num;i++) 
      { 
       if(num%i== 0) 
       { 
        printf("\n Not a prime number.\n"); 
        break; 
       } 
      } 
      if(i==num) 
       printf("\n Prime number.\n"); 
      break; 
     case 3: 
      printf("\nEnter number:"); 
      scanf("%d",&num); 
      if(num %2==0) 
       printf("\n Even number.\n"); 
      else 
       printf("\nOdd number.\n"); 
      break; 
     case 4: 
      break; 
     default: 
      printf("\nInvalid Argument.\n"); 
     } 
    }while(choice != 4); 
    return 0; 
} 

コードが入力1,2,3,4 and any other integerと正常に動作しますが、私は、文字または文字列を入力すると、コードが無限ループに入る:

は、ここに私のコードです。どうして?このケースをどう扱うか?

+1

インデントしてください。このコードは、そのような難しい左翼を踏襲するのは本当に難しいです。 – tadman

+2

'scanf()'の戻り値を調べます。 'scanf()'関数は、文字または文字列が入力されたときにゼロを返します。 – iqstatic

+0

すべての警告とデバッグ情報( 'gcc -Wall -g')でコンパイルしてください。次に**デバッガ** gdbを使用してください(これはあなたが使い方を学ぶべきです)。 –

答えて

3

scanf()関数の戻り値を確認できます。このようなもの:

if((scanf("%d", &choice)) != 1){ 
    printf("Invalid Argument\n"); 
    continue; 
} 
else 
{ 
    //Your switch case logic 
} 
+5

'fflush(stdin)'は標準Cでは未定義の動作です。 –

+0

はい、そうです。 OPを選択してプログラムを終了するか、実行を続けるかを決定します。私はこれを私の答えに組み込んだ。 – iqstatic

+0

@DavidBowling:はいfflushは古いglibcのバージョンでは矛盾していることが知られています。しかし、私はそれが新しいバージョンで動作するはずだと思います。ただし、コードに移植性の問題がある可能性があるという警告があります。 – iqstatic

関連する問題