这段代码出错了吗?

时间:2015-03-11 01:21:25

标签: c

所以,我不明白我的逻辑在这个问题上有什么缺陷。

它从左到右读取表达式,操作数是浮点数。

然而,我的程序陷入了循环。它读取并分配最终的数字,例如它将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

3 个答案:

答案 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,但operchar。将oper更改为intEOF无法表示为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
$