所以,我不明白我的逻辑在这个问题上有什么缺陷。
它从左到右读取表达式,操作数是浮点数。
然而,我的程序陷入了循环。它读取并分配最终的数字,例如它将10.5分配给num1,但它永远不会退出循环。
int main(void)
{
float num1, num2;
char oper = 0;
printf("Enter an expression: ");
scanf("%f", &num1);
while (oper != ('\n' || EOF))
{
oper = getchar();
scanf("%f", &num2);
switch (oper)
{
case '+':
num1 += num2;
break;
case '-':
num1 -= num2;
break;
case '*':
num1 *= num2;
break;
case '/':
num1 /= num2;
break;
}
}
printf("Value of Expression: %.2f", num1);
return 0;
}
预期产出:
Enter an expression: 1+2.5*3
Value of expression: 10.5
答案 0 :(得分:5)
while (oper != ('\n' || EOF))
这里是('\n' || EOF) == 1
,所以除非你输入对应于1的ASCII字符(这是不可打印的),否则循环不会终止。正如Leffler所指出的那样,这应该是while (oper != '\n' && oper != EOF)
(尽管见下一点)。您在读取之前检查了while循环中的oper
,因此您的while循环将在“换行符/ EOF之后”终止一步。 while循环实际应该是:
while(1) {
oper = getchar();
if(oper == '\n' || oper == EOF) {
break; // Exit out of loop, ignoring the rest of the code inside the loop.
}
scanf("%f", &num2);
// ...
}
getchar
会返回int
,但oper
是char
。将oper
更改为int
(EOF
无法表示为char
)
答案 1 :(得分:1)
使oper成为一个int。 255不等于EOF
答案 2 :(得分:1)
您需要修改循环结束条件。您的程序实际上正在等待您在第一个换行符后键入另一个号码。
#include <stdio.h>
int main(void)
{
float num1, num2;
printf("Enter an expression: ");
if (scanf("%f", &num1) != 1)
return 1;
printf("Num1: %f\n", num1);
while (1)
{
int oper;
if ((oper = getchar()) == EOF || oper == '\n')
break;
printf("Operator: %c\n", oper);
if (scanf("%f", &num2) != 1)
break;
printf("Num2: %f\n", num2);
switch (oper)
{
case '+':
num1 += num2;
break;
case '-':
num1 -= num2;
break;
case '*':
num1 *= num2;
break;
case '/':
num1 /= num2;
break;
}
printf("num1 = %f\n", num1);
}
printf("Value of Expression: %.2f\n", num1);
return 0;
}
请注意,此代码会检查每个输入操作以确保其成功。它还使用int oper
代替char oper
来确保准确检测到EOF。关键的诀窍是在getchar()
读取换行符后不要求更多输入;您的程序因第二次scanf()
调用而等待您键入内容而停滞不前。请注意此代码如何打印其输入,以便您可以了解正在进行的操作。当一个程序行为不端时,找出错误的方法是一种更简单的方法。当我看到Operator:
和一个空行 - 并且程序悬而未决 - 我很快就知道问题是什么。
示例运行(程序名称:stuck
):
$ ./stuck
Enter an expression: 1+2.5*3
Num1: 1.000000
Operator: +
Num2: 2.500000
num1 = 3.500000
Operator: *
Num2: 3.000000
num1 = 10.500000
Value of Expression: 10.50
$