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
数字以外的任何内容?如果 x
是 char
,我会使用 isdigit()
,但事实并非如此。
(顺便说一下,我希望 x
成为 long double
这样我就可以输入带小数的数字)。
scanf()
将尽可能多地转换字符串中的值。如果无法转换,它将停止处理该字符串。无论哪种方式,函数 returns 一个指示转换了多少个值的值。
如果第一个值(x
)不是数字且无法转换,则停止。因此第二个值 (op
) 不会改变。这会导致您的循环继续。
检查 scanf()
返回的值以自行确认此行为。
此外,"I want x to be a long double so I can input numbers with decimals" - float
和 double
类型的值也支持带小数的数字。
最后,正如其他人指出的那样,您应该在代码的开头初始化 op
,然后再测试它是否等于 "q"。这将确保该值是您当时期望的值。
我是初学者,作为练习,我必须编写一个非常简单的计算器,根据用户输入的数字和运算符修改堆栈。
这是代码:
#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
数字以外的任何内容?如果 x
是 char
,我会使用 isdigit()
,但事实并非如此。
(顺便说一下,我希望 x
成为 long double
这样我就可以输入带小数的数字)。
scanf()
将尽可能多地转换字符串中的值。如果无法转换,它将停止处理该字符串。无论哪种方式,函数 returns 一个指示转换了多少个值的值。
如果第一个值(x
)不是数字且无法转换,则停止。因此第二个值 (op
) 不会改变。这会导致您的循环继续。
检查 scanf()
返回的值以自行确认此行为。
此外,"I want x to be a long double so I can input numbers with decimals" - float
和 double
类型的值也支持带小数的数字。
最后,正如其他人指出的那样,您应该在代码的开头初始化 op
,然后再测试它是否等于 "q"。这将确保该值是您当时期望的值。