【问题标题】:Why scanf doesn't block the thread for input in this case? Objective-C为什么 scanf 在这种情况下不会阻止线程输入? Objective-C
【发布时间】:2010-02-08 11:46:50
【问题描述】:

这一定很简单,但由于我来自 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 不阻塞线程并再次要求正确输入?

谢谢 诺伊

【问题讨论】:

    标签: objective-c scanf


    【解决方案1】:

    这不是 ObjC 问题,而是 C 问题。

    问题是没有阻塞线程。在您的scanf 中,您需要一个浮点数 (%lf),后跟一些空格 (),然后是一个字符 (%c)。但是当你输入e 时,它不是一个有效的浮点数,所以scanf 立即失败。

    但无效字符e 仍留在缓冲区中。所以,在下一次对stdin的操作中,你再次请求一个浮点数,它失败并立即再次返回,因为e仍然无效,然后下一个scanf再次请求一个浮点数, 无限

    详情请见Why is scanf() causing infinite loop in this code?

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

    【讨论】:

    • 那么,如果 scanf 失败了一次,它就不能再次使用相同的变量了吗?如果匹配失败,则 while 循环将变为无限,因为 scanf 不会阻止用户输入。我猜它在引擎盖下弄乱了一些东西。我想了解究竟是什么。
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2020-10-06
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多