C:无法弄清楚是什么导致了无限循环

C: can't figure out what is causing an infinite loop

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

这是代码:

#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 这样我就可以输入带小数的数字)。

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

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

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

此外,"I want x to be a long double so I can input numbers with decimals" - floatdouble 类型的值也支持带小数的数字。

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