嗨我新手到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"
?
答案 0 :(得分:4)
if (argc != 4)
应该在开头。*
的使用。请改为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...
进行高度嵌套的代码检查。您可以只检查正确数量的参数,并在此时return
或exit
。
将各个部分放在一起,你可以用以下内容整理:
#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