1

基本的に、アキュムレータを実装する単純なコマンド ライン計算機を作成しています。このコードは論理的に正しく構造化されているように感じますが、print ステートメントの無限ループに入る前に約 3 秒間フリーズする理由がわかりません。どんな助けでも大歓迎です。

void mycalc() {
  printf("Begin Calculations\n\n");
  printf("Initialize your Accumulator with data of the form \"number\" \"S\" which\
  sets the Accumulator to the value of your number\n");

  /* Initialize Variables */
  float accumulator, num;
  char op;

  /* Ask for input */
  scanf("%f %c\n", &num, &op);
  while (op != 'E') {
    if(op == 'S' || op == 's'){
      accumulator = num;
      printf("Value in the Accumulator = %f\n", accumulator);
    } else if(op == '+'){
      accumulator = accumulator + num;
      printf("Value in the Accumulator = %f\n", accumulator);
    } else if(op == '*'){
     accumulator = accumulator * num;
      printf("Value in the Accumulator = %f\n", accumulator);
    } else if(op == '/'){
      if (num == 0) {
          printf("Can not divide by 0.\n");
      } else {
          accumulator = accumulator / num;
          printf("Value in the Accumulator = %f\n", accumulator);
      }
    } else if(op == '-'){
      accumulator = accumulator - num;
      printf("Value in the Accumulator = %f\n", accumulator);
    } else if(op == 'E' || op == 'e'){
      printf("Value in the Accumulator = %f\n", accumulator);
      break;
    } else {
      printf("Unknown operator. \n");
    }
    scanf("%f %c\n", &num, &op);
  }
}

代わりに while(1) 手法を使用する方がよいでしょうか? どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

1

コードは不適切な入力を適切に処理しません。

scanf("%f %c\n", &num, &op)数値以外の入力が入ると2箇所トラブルが発生。はscanf()失敗するためnum、 とopは古い値を保持します。に基づく操作opが再度実行され、次は同じデータscanf()で再試行されます。

"%f %c\n"2 か所の は、OP の期待とは異なるパフォーマンスを示すという点で誤解を招きます\n。への変更

scanf("%f %c", &num, &op);

を使用する代わりに、使用するscanf()ことをお勧めします

char buf[100];
if (fgets(buf, sizeof(buf), stdin) == NULL) {
  exit(-1); // handle EOF or error
}
if (sscanf(buf, "%f %c", &num, &op) != 2) {
  exit(-1); // syntax error.
}

あるいは、以下を使用することもできます。悪い入力は最終的に消費されますが、それほど簡単ではありません。

if (2 != scanf(" %c %f", &op, &num)) {
  ; // syntax error.
}

その他の問題: アキュムレータが初期化されていません

float accumulator = 0.0;
于 2013-09-24T01:43:30.427 に答える