使用参数的简单计算器

时间:2016-04-13 02:30:56

标签: c

嗨我新手到C和我试图编写一个简单的arg计算器,但我得到了奇怪的结果:

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

int main (int argc, char **argv) {

    int res;
    int boo = 0;
    int fstnum = atoi (argv[1]);
    int scnnum = atoi (argv[3]);
    char op = argv[2][0];

    if (argc != 4) {
        printf ("Invalid parameters !\n");
        printf ("Try [Num] [Opr] [Num] for example : 1 * 1 \n");
    }
    else {
        switch (op) {
            case '+':
                res = fstnum + scnnum;
                break;
            case '*':
                res = fstnum * scnnum;
                break;
            case '-':
                res = fstnum - scnnum;
                break;
            case '%':
                res = fstnum % scnnum;
                break;
            case '/':
                if ((scnnum = 0)) {
                    printf ("Error ! Can't devide by zero");
                    boo = 1;
                } else {
                    res = fstnum / scnnum;
                }
                break;
            default:
                boo = 1;
                printf ("Invalid Operator Try again!\n");
        }
    }

    if ((boo = 0)) {
        printf ("The result is :  %d", res);
    }

    printf ("%d\n", fstnum);
    printf ("%c\n", op);
    printf ("%d\n", scnnum);

    return 0;
}

以这个$ argcalc 1 * 1运行程序之后我得到了:

无效的操作员再试一次!

1

a

1

我仍然不明白为什么"*"需要"a"

3 个答案:

答案 0 :(得分:4)

  1. 在您考虑使用参数之前,if (argc != 4)应该在开头。
  2. shell解释*的使用。请改为argcalc 1 '*' 1

答案 1 :(得分:1)

如果您不熟悉C,请不要在if语句中指定,这就是为什么有人建议先将运算符的右侧放在首位,如下所示:

if (0 == boo) {
    printf("The result is : %d\n",res);
}

这样编译器会在你误认为== for =。

时明确警告你

另外,将argc的检查放在main的开头。

第三,*将被shell解释为通配符,因此请确保在命令行中使用'*'。你看到'a'是因为这个。

答案 2 :(得分:0)

你很亲密。除了您对'*'作为通配符的shell解释以及赋值而不是条件表达式之外,还可以进行其他一些改进。

通常,当您提供错误信息时,您需要写入stderr而不是stdout,例如

    fprintf (stderr, "error: invalid number of parameters\n"
                     "usage: num [+*-%%/] num (e.g. 1 * 1 )\n");

不需要boo。你不会吓唬机器退出。此时您只需return 1;(退出代码0通常代表成功,其他任何内容都是错误条件的数字代码。

不需要对if (argc != 4)... else...进行高度嵌套的代码检查。您可以只检查正确数量的参数,并在此时returnexit

将各个部分放在一起,你可以用以下内容整理:

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

int main (int argc, char **argv) {

    if (argc != 4) {
        fprintf (stderr, "error: invalid number of parameters\n"
                         "usage: num [+*-%%/] num (e.g. 1 * 1 )\n");
        return 1;
    }
    int res, fstnum = atoi (argv[1]), scnnum = atoi (argv[3]);
    char op = *argv[2];

    switch (op) {
        case '+': res = fstnum + scnnum; break;
        case '*': res = fstnum * scnnum; break;
        case '-': res = fstnum - scnnum; break;
        case '%': res = fstnum % scnnum; break;
        case '/':
            if (!scnnum) {
                fprintf (stderr, "error: divide by zero\n");
                return 1;
            } else res = fstnum / scnnum; break;
        default:
            fprintf (stderr, "error: invalid operator\n");
            return 1;
    }

    printf (" %d %c %d = %d\n", fstnum, op, scnnum, res);

    return 0;
}

示例使用/输出

$ for i in + \* - % /; do ./bin/rfmt 8 "$i" 4; done
 8 + 4 = 12
 8 * 4 = 32
 8 - 4 = 4
 8 % 4 = 0
 8 / 4 = 2