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,你再次请求一个浮点数,它失败并立即再次返回,因为e仍然无效,然后下scanf一个再次请求一个浮点数,无限循环

请参阅为什么 scanf() 在此代码中导致无限循环?详情。

更安全的替代方法是使用fgets读取原始输入,然后将接收到的字符串解析为 getvalue2operator

于 2010-02-08T11:55:57.813 回答