C简介:添加和循环

C简介:添加和循环,c,debugging,floating-point,calculator,addition,C,Debugging,Floating Point,Calculator,Addition,我正在继续我对掌握C的探索,我目前正在做一个练习,让我的初级计算器不断提示我输入两个操作数和一个运算符。如果运算符不是“+”,则会显示错误消息。现在,我遇到了一些问题 当我输入“+”时,它会显示两次。我在代码中找不到任何东西表明这会发生 第一个操作数也存在同样的问题。我也不知道如何告诉我的代码,我已经完成输入 第二个操作数很好,但我仍然不知道如何终止输入 在显示结果之后,它会正确地返回,但在再次提示之前会给我一条错误消息 注意:我知道您使用lf在scanf中读取双精度数字,但由于某些原因,lf

我正在继续我对掌握C的探索,我目前正在做一个练习,让我的初级计算器不断提示我输入两个操作数和一个运算符。如果运算符不是“+”,则会显示错误消息。现在,我遇到了一些问题

  • 当我输入“+”时,它会显示两次。我在代码中找不到任何东西表明这会发生
  • 第一个操作数也存在同样的问题。我也不知道如何告诉我的代码,我已经完成输入
  • 第二个操作数很好,但我仍然不知道如何终止输入
  • 在显示结果之后,它会正确地返回,但在再次提示之前会给我一条错误消息
  • 注意:我知道您使用lf在scanf中读取双精度数字,但由于某些原因,lf不适用于我,而f工作正常,所以忽略:)

    任何意见,以及关于如何设置代码格式/在本网站上提问/如何处理类似问题的一般建议,都将不胜感激。谢谢你的帮助

    int main () {
    char mychar;
        int a;
        double op1;
        double op2;
    
        printf("Welcome to Andrew Hu's calculator program!\n"); //Greeting
    
        while(1)
        {    printf("Enter a mathematical operation to perform:\n");
            scanf("%c", &mychar);
    
        if(mychar == '+') //Valid Operators
            a = 1;
        else
            a = 0;
    
    
        if(a == 0) //Operator Checker, error if invalid
            printf("\nError, not a valid operator\n");
        else if(a == 1){
            printf("%c\n", mychar),
            printf("Enter OP1:\n"),
            scanf("%f", &op1),
            printf("%f\n", op1),
            printf("Enter OP2:\n"),
            scanf("%f\n", &op2),
            printf("%f\n", op2),
            printf("Result of %f %c %f = %f\n",
                    op1, mychar, op2, (op1 + op2) );
        }
        }        
    

    这是一个典型的例子,您的老师/导师/书籍/在线教程/任何建议使用
    scanf()
    都是一个好主意,但事实并非如此。您也不应该对行尾做任何假设,作为最后一点,您应该更好地构造代码(包括大括号的格式和一致性)

    我建议您不要使用poor
    scanf()
    ,它并不总是像您认为的那样,尤其是在有单个字符、字符串和换行符需要读取的情况下。相反,您最好阅读一行并对其进行分析和/或验证。如果你做得正确,它也会简单得多

    我也不知道如何告诉我的代码,我已经完成输入

    好吧,由你决定。请
    quit
    操作员如何?例如:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int main()
    {
        char buf[0x100] = { 0 };
    
        while (1) {
            // If the user has entered "q", we enter the loop        
            fgets(buf, sizeof(buf), stdin);
            if (buf[0] == 'q') break;
    
            char *end;
            float op1 = strtof(buf, &end); // parse 1st operand
    
            while (isspace(*end)) {
                end++;
            }
    
            char op = *end++; // get operator
    
            float op2 = strtof(end, NULL); // parse 2nd operand
            float r;
    
            // do the calculation
            switch (op) {
            case '+':
                r = op1 + op2;
                break;
            case '-':
                r = op1 - op2;
                break;
            case '*':
                r = op1 * op2;
                break;
            case '/':
                r = op1 / op2;
                break;
            default:
                fprintf(stderr, "Error: invalid operator '%c'\n", op);
                continue;
                break;
            }
    
            // print the result
            printf("%f %c %f = %f\n", op1, op, op2, r);
        }
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    int main()
    {
    char buf[0x100]={0};
    而(1){
    //如果用户输入了“q”,我们就进入循环
    fgets(buf、sizeof(buf)、stdin);
    if(buf[0]=='q')中断;
    字符*结束;
    float op1=strtof(buf,&end);//解析第一个操作数
    while(isspace(*end)){
    end++;
    }
    char op=*end++;//get运算符
    float op2=strof(end,NULL);//解析第二个操作数
    浮子r;
    //计算
    开关(op){
    格“+”:
    r=op1+op2;
    打破
    案例'-':
    r=op1-op2;
    打破
    案例“*”:
    r=op1*op2;
    打破
    案例“/”:
    r=op1/op2;
    打破
    违约:
    fprintf(stderr,“错误:无效的运算符“%c”\n”,op);
    继续;
    打破
    }
    //打印结果
    printf(“%f%c%f=%f\n”,op1,op,op2,r);
    }
    返回0;
    }
    
    首先,您需要在scanf中读取一个double,否则您只需读取一个float并将其存储在double的一半中

      scanf("%lf", &op1),
    

    printf不需要这样做,因为每个float参数首先被提升为double…

    对于初学者来说,它的
    main()
    {,而不是
    main{
    。您可以尝试发布编译后的代码。感谢您的反馈,已编辑!当您阅读
    op2
    时,您的格式字符串中有一个换行符;这不正确。请将其更改为阅读
    scanf(“%f”,&op2);
    。谢谢!!这实际上解决了我所有的问题,但成功操作后收到的错误消息除外(见图)你没有向OP解释他的代码有什么问题。不过回答得很好+1@suspectus谢谢。我已经试过了……主要的问题是OP expected
    scanf()
    来做它不能做/不做的事情。@AndrewHu to OP:1.感谢您的接受,2.如果您需要更高的精度,您当然可以使用
    double
    strod()
    。@H2CO3:注意,您可以通过在
    %c
    转换说明符前面加一个空格,使其忽略前导空格:
    scanf(“%c”,&mychar);
    @JohnBode是的,当然。这种输入的格式字符串可能类似于
    %f[]%c[]%f[^\n]
    ,但不确定这是否更容易阅读。:)
      scanf("%lf", &op1),