【问题标题】:Struggling to program a simple calculator努力编写一个简单的计算器
【发布时间】:2015-11-10 15:26:14
【问题描述】:

我正在尝试编写一个简单的计算器。
这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) { 

char operator = 0;
float num1 = 0.0;
float num2 = 0.0;
float sol = 0.0;


while (operator != 'q') {

    printf("Operator: ");
    scanf("%c", &operator);
    printf("First Number: ");
    scanf("%f", &num1);
    printf("Second Number: ");
    scanf("%f", &num2);

    switch (operator)
    {
    case '+': sol = num1 + num2; break;
    case '-': sol = num1 - num2; break;
    case '*': sol = num1 * num2; break;
    case '/': sol = num1 / num2; break;
    case 'q': printf("Finished!"); exit(0);
    default: printf("Error!"); exit(0);
    }

    printf("The solution is: %.2f\n\n", sol); 
}

return 0;
}

所以对我来说,代码很好。如您所见,我使用 while 循环执行此操作,该循环可让您进行计算,直到您输入 'q' 作为运算符。循环的第一次运行运行良好,但随后变得令人毛骨悚然(我的控制台):

Operator: +
First Number: 5
Second Number: 4
The solution is: 9.00

Operator: First Number:

为什么程序不让我在第二次循环运行时输入运算符?

【问题讨论】:

  • 处理错误时,不要只说“错误!”。您需要生成尽可能多的信息。 printf ("Error! Didn't expect operator %c (%d)\n", operator, operator); 发生的事情是您在输入的第一行末尾捕获换行符。

标签: c switch-statement calculator break


【解决方案1】:

大多数带有 scanf 的格式说明符将跳过前导空格。 %c 没有。
scanf("%f", &amp;num2); 在第一次迭代结束时在输入缓冲区中留下一个换行符。
scanf("%c", &amp;operator); 在第二次迭代开始时,读取换行符并继续。
scanf(" %c", &amp;operator); 中在%c 之前使用空格将允许%c 跳过前导空格并捕获运算符。

【讨论】:

    【解决方案2】:

    您应该检查scanf 是否有错误:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
        char operator = 0;
        float num1 = 0.0;
        float num2 = 0.0;
        float sol = 0.0;
    
        while (operator != 'q') {
    
            printf("Operator: ");
            if((scanf(" %c", &operator)) != 1){
                printf("Error, Fix it!\n");
                exit(1);
            }
    
            printf("First Number: ");
            if((scanf("%f", &num1)) != 1){
                printf("Error, Fix it!\n");
                exit(1);
            }
    
            printf("Second Number: ");
            if((scanf("%f", &num2)) != 1){
                printf("Error, Fix it!\n");
                exit(1);
            }
    
            switch (operator){
                case '+': sol = num1 + num2; break;
                case '-': sol = num1 - num2; break;
                case '*': sol = num1 * num2; break;
                case '/': sol = num1 / num2; break;
                case 'q': printf("Finished!"); exit(0);
                default: printf("Error!"); exit(0);
            }
    
            printf("The solution is: %.2f\n\n", sol);
        }
    
        return 0;
    }
    

    如你所见,我将scanf("%c", &amp;operator); 更改为scanf(" %c", &amp;operator); 以使scanf 忽略(跳过)Whitespace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多