0

私は Stephen Kochan による「C でのプログラミング」から C を学んでいます。私は第 6 章の演習 4 に取り組んでおり、単純なアキュムレータ計算機として機能するコードを書いています。コードは次のとおりです。入力が正しい順序で提供されている限り、正常に機能します。

#include<stdio.h>

    int main(void)
    {
        float num, accum = 0;

        char operator;


        while(1)

        {

          printf("Enter the number and the operator ");
          scanf("%f %c",&num, &operator);

          if (operator == 'E') break;

          switch (operator){

        case 'S':
          accum = num;
          printf("= %g\n",accum);
          break;

        case '+':
          accum = accum + num;
          printf("= %g\n",accum);
          break;

        case '-':
          accum = accum - num;
          printf("= %g\n",accum);
          break;

        case '*': 
          accum = accum * num;
          printf("= %g\n",accum);
          break;

        case '/':
          accum = accum / num;
          printf("= %g\n",accum);
          break;
          }      
        }

        printf("= %g\n",accum);
        printf("End of Calculation\n");

      return 0;

    }

しかし、間違った入力でハングします。そのような行動をチェックするために何ができるでしょうか?

4

3 に答える 3

6

短いバージョンは「使用しないでください」ですscanf()

問題はscanf()、限られたエラーの表示しか提供せず、エラーのあるデータが読み取られないままになり、次の呼び出しで取得されることです。特に、エラー チェックを行う必要がない場合は、不正なデータで永遠にスピンするだけです。

  1. 戻りコードを常にチェックして、それが機能したかどうかを確認してください。
  2. 行指向の入力を行っている場合は、fgets()または類似のものを使用して行全体を読み取り、行sscanf()から解析します。
  3. 入力が期待したものではない場合は、ただ突き進むのではなく、賢明なことを行います。(既存のコードは、常に有効であると想定しています。)
于 2012-04-09T10:24:58.930 に答える
2

使用しないでscanfください。それがこのプログラムの最初の提案です。ここgetcharに示すようなものを使用してください。彼らはあなたと同じ問題を扱っています。

于 2012-04-09T10:19:44.847 に答える
2
  1. scanf()2 を返し、両方の引数が取り込まれたことを示すチェック
  2. エラーを報告する switch ステートメントにデフォルトのケースを指定します。

堅牢性を高めるために、 を使用して行全体を読み取り(バッファ オーバーフローに対して脆弱であるためfgets()使用しないでください)、 を使用して結果を解析することをお勧めします。これは、不正な入力から回復したい場合にのみ必要です。それ以外の場合、問題が発生した場合はand (およびエラー メッセージ) をそのまま使用してください。gets()sscanf()scanf()exit(1)

于 2012-04-09T10:22:58.800 に答える