【问题标题】:C: can't figure out what is causing an infinite loopC:不知道是什么导致了无限循环
【发布时间】:2018-01-19 16:50:40
【问题描述】:

我是一个初学者,作为练习,我必须编写一个非常简单的计算器,该计算器通过用户输入的数字和运算符来修改堆栈。

这是代码:

#include <stdio.h>

int main (void)
{
   long double x, stack = 0;
   char op;

   printf("Input an operator and a number:\n");

   while ( op != 'q' )
   {
      scanf("%Lf %c", &x, &op);
      switch (op)   
      {
      case '+':
         stack += x;
         printf("= %Lg", stack);
         printf("\n");
         break;
      case '-':
         stack -= x;
         printf("= %Lg", stack);
         printf("\n");
         break;
      case '*':
         stack *= x;
         printf("= %Lg", stack);
         printf("\n");
         break;
      case '/':
         if (x == 0)
         { 
            printf("Can't divide by 0.");
            printf("\n");
            break;
         }
         stack /= x;
         printf("= %Lg", stack);
         printf("\n");
         break;
      case 's':
         stack = x;
         printf("stack set to %Lg", x);
         printf("\n");
         break;
      case 'q':
         printf("Bye!\n");
         break;
      default:
         printf("Unknown operator.\n");
         break;
      }
   }

   printf("Bye!\n");
   return 0;
}

现在的问题是,只要x 不是数字,程序就会一直循环。为什么?

除了x 的数字外,我如何阻止用户输入任何内容?如果xchar,我会使用isdigit(),但事实并非如此。

(顺便说一句,我希望x 成为long double,这样我就可以输入带小数的数字)。

【问题讨论】:

  • 仅供参考,在循环的第一次迭代之前,您有未定义的行为。 op != 'q' 已测试,而 op 仍未初始化。
  • 你需要检查来自scanf的返回值
  • 在每种情况下都没有理由使用第二个 printf,只需将 \n 作为第一个的一部分: printf("= %Lg\n", stack);
  • 谢谢@Robᵩ。我知道,SornelHaetir,但还是谢谢你。
  • @ToritoVerdejo .. 那么你为什么不在这里发帖之前修复它,浪费用户的时间告诉你你已经知道的东西?

标签: c scanf infinite-loop


【解决方案1】:

scanf() 将尽可能多地转换字符串中的值。如果无法转换,则停止处理该字符串。无论哪种方式,该函数都会返回一个值,指示转换了多少个值。

如果第一个值 (x) 不是数字且无法转换,则会停止。所以第二个值 (op) 不会改变。这会导致您的循环继续。

检查scanf()返回的值以自己确认此行为。

另外,“我希望 x 是一个 long double,这样我就可以输入带小数的数字” - floatdouble 类型的值也支持带小数的数字。

最后,正如其他人所指出的,您应该在代码开头初始化op,然后再测试它是否等于“q”。这将确保该值符合您当时的预期。

【讨论】:

  • 我认为最后一段应该是第一段。
  • @machine_1:我认为这不应该是第一个,因为这不是他要问的,也不会引起他要问的问题。我先回答了他的问题,然后指出了其他问题。
  • 谢谢你的回答,我知道了。 (PS:我知道你说的最后一件事。我刚刚提到它是为了明确我不想使用任何不是浮点数或双精度数的东西)。
  • @ToritoVerdejo:我已经告诉过你了。检查scanf() 的返回值。如果它不能转换任何值,那么输入值的方式有问题。
  • 好的,我以为这只是为了检查scanf() 的工作原理。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2013-06-17
相关资源
最近更新 更多