0

これは非常に単純なはずですが、Java の世界から来たので、この場合は少し森の中にいるように感じます。

while (operator != 'E') {
  NSLog(@"Enter:");
  scanf("%lf %c", &value2, &operator);

  switch (operator) {
   case 'S':
    [deskCalc setAccumulator:value2];
    break;
   case 'E':
    break;
   case '+':
    [deskCalc add:value2];
    break;
   case '-':
    [deskCalc subtract:value2];
    break;
   case '/':
    [deskCalc divide:value2];
    break;
   case '*':
    [deskCalc multiply:value2];
    break;
   default:
    NSLog(@"Unknown command");
    break;
  }

  NSLog(@"=%g", [deskCalc accumulator]);

 }

ここで、最初に数字を入力せずに「e」またはその他の文字のみを入力すると、プログラムは次のようにループします。

2010-02-08 13:44:38.690 Calculator[89939:a0f] Enter:
2010-02-08 13:44:38.691 Calculator[89939:a0f] Unknown command
2010-02-08 13:44:38.691 Calculator[89939:a0f] =10
2010-02-08 13:44:38.692 Calculator[89939:a0f] Enter:
2010-02-08 13:44:38.692 Calculator[89939:a0f] Unknown command
2010-02-08 13:44:38.693 Calculator[89939:a0f] =10

scanf がスレッドをブロックせず、正しい入力を再度要求しないのはなぜですか?

ありがとうノイ

4

1 に答える 1

2

これはObjCの問題ではなく、Cの問題です。

問題はスレッドをブロックしていないことです。ではscanf、浮動小数点数(%lf)、空白()、文字()の順に要求します%c。ただし、を入力するeと、有効な浮動小数点数ではないため、scanfすぐに失敗します。

ただし、無効な文字eはまだバッファに残っています。したがって、を使用した次の操作では、浮動小数点数を再度要求しますが、まだ有効ではないstdinため失敗し、すぐに再び戻ります。次に、浮動小数点数を再度要求しますescanf

scanf()がこのコードで無限ループを引き起こすのはなぜですか?を参照してください。詳細については。

より安全な代替方法は、を使用fgetsして生の入力を読み取り、受信した文字列を解析してgetvalue2とを取得することoperatorです。

于 2010-02-08T11:55:57.813 に答える