2

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

  1. 当我输入“+”时,它会显示两次。我的代码中没有任何东西表明这会发生。
  2. 第一个操作数表现出同样的问题。我也不知道如何告诉我的代码我已经完成了输入。
  3. 第二个操作数很好,但我仍然不知道如何终止输入。
  4. 在它显示结果之后,它会正确循环返回,但在再次提示之前给我一条错误消息。

http://tinypic.com/r/34ew5cx/6

注意:我知道您使用 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) );
    }
    }        
4

2 回答 2

3

这是一个典型的案例,您的老师/导师/书籍/在线教程/任何建议使用scanf()是一个好主意,而实际上并非如此。您也不应该对行尾做出任何假设,并且作为最后和边缘的旁注,您应该更好地构建代码(包括花括号的格式和一致性)。

我建议你做的是别管穷人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;
}
于 2013-04-17T17:43:47.057 回答
0

首先,您需要在 scanf 中使用 %lf 来读取双精度,否则您只需读取一个浮点数并将其存储在双精度的一半中...

  scanf("%lf", &op1),

这对于 printf 来说不是必需的,因为每个 float 参数首先被提升为 double ...

于 2013-04-17T17:45:23.777 回答