2016-03-21 11 views
2

whileループを使用して値をテストし、値(この場合はswitch文を使用して文字グレード)に適切な応答を返す簡単なコードを記述することになります。scanf入力のスイッチ

私の問題は、整数を含まない値をテストすることです。私はswitch文の前にIFテストで問題を解決できると信じています。私はこの声明を表現する助けを求めています。

私はループの後に授与される割り当てであると思いますが、私は迷っていることを知っています。私はまた、エラーをチェックし、そのエラーに対する例外コードと書き込み方法の提案にもオープンします。

誰かがとても親切であれば、scanfが入力から値を割り当てるという点でどのように機能するか説明してください。私は問題がscanfが値を割り当てる方法にあると信じています。私は自分のコードがswitchと実際の値とを比較しているとは思っていません。

#include <stdio.h> 
#include <stdlib.h> 

int main(void) {  
    int grades; 

    printf("Enter a value for grading in numeric form\n"); 

    while ((scanf("%i", &grades)) != EOF) { 
     switch (grades) { 
      case 10: 
      case 9: 
      printf("A grade of %i is an A\n", grades); 
      break; 
      case 8: 
      printf("A grade of %i is an B\n", grades); 
      break; 
      case 7: 
      printf("A grade of %i is an C\n", grades); 
      break; 
      case 6: 
      printf("A grade of %i is an D\n", grades); 
      break; 
      case 5: 
      case 4: 
      case 3: 
      case 2: 
      case 1: 
      case 0: 
      printf("A grade of %i is an F\n", grades); 
      break;                         
      default: 
      printf("This is not a valid entry\n");  
     } 
    } 
    return 0; 
} 

あなたはそのscanf戻り1だけではなく、ファイルの終わりをチェックするのをテストする必要があり、そのようなA.

+0

また、 'scanf'が実際に' grades'を書いたかどうかを確認してください。 – Olaf

+0

オラフ私はそれが私がそれをどうやって行方不明であると信じていますか? –

+0

'scanf'のマニュアルページはどうですか? – Olaf

答えて

2

などの文字を渡そうとした場合、私は無限ループのエラーを取得します。数値でない入力を入力すると、scanfが失敗し、0が返されますが、違反入力はstdinに残ります。ループ本体は、無効な値のgradesで実行され、次の繰り返しが無期限に失敗します。

変更するコード:

while (scanf("%i", &grades) == 1) { 
    ... 
} 

あなたのループが無効な入力の場合に再起動する場合は、これにコードを変更:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    char buf[80]; 
    int grades; 

    for (;;) { 
     printf("Enter a value for grading in numeric form\n"); 
     if (fgets(buf, sizeof buf, stdin) == NULL) 
      break; 

     if (sscanf(buf, "%i", &grades) != 1) { 
      printf("not a number: %s", buf); 
      continue; 
     } 
     switch (grades) { 
      case 10: 
      case 9: 
      printf("A grade of %i is an A\n", grades); 
      break; 
      case 8: 
      printf("A grade of %i is an B\n", grades); 
      break; 
      case 7: 
      printf("A grade of %i is an C\n", grades); 
      break; 
      case 6: 
      printf("A grade of %i is an D\n", grades); 
      break; 
      case 5: 
      case 4: 
      case 3: 
      case 2: 
      case 1: 
      case 0: 
      printf("A grade of %i is an F\n", grades); 
      break;                         
      default: 
      printf("This is not a valid grade: %d\n", grades); 
      break; 
     } 
    } 
    return 0; 
} 
+0

int 1は私がテストする値です。それはスイッチのケースです。一度に複数の項目をテストできるように、非数値のテストが必要です。 –

+0

@AndrewBodin: 'scanf'は成功したコンバージョン数を返します。ユーザーが数値以外のグレードを入力した場合、正確に何をしたいですか? – chqrlie

+0

デフォルトを返すようにswitch文を取得しようとしています。現時点では、連続ループを実行します。私はこれを進める方法についての提案を受けています。 ANSI固有の文字が範囲外であるかどうかはテストできません。これは動作するがシステムに依存します。 –

1

これはオプションのソリューションとしての作品、それは上記のコードと同じように思えます。

int main(void) { 
int grades; 
int temp; 

while((temp = scanf("%i", &grades)) != EOF) 
{ 
    if(temp == 0) 
    { 
     printf("Invalid charactur\ne"); 
     while(getchar() != '\n') 
      ; 
    } 
    else 
     switch (grades) { 
関連する問題