C:无法弄清楚导致无限循环的原因

时间:2018-01-19 16:50:40

标签: c scanf 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所以我可以输入带小数的数字。)

1 个答案:

答案 0 :(得分:1)

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

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

检查op返回的值以自行确认此行为。

另外,&#34;我希望x是一个long double,所以我可以输入带小数的数字&#34; - 类型scanf()float的值也是支持带小数的数字。

最后,正如其他人指出的那样,你应该在代码开始时初始化double,然后再测试它是否等于&#34; q&#34;。这将确保价值符合您当时的预期。