[英]Calculator program in C using Command Line Arguments (argc, argv)
I've written a program to take input arguments from command line and create a basic calculator in C. Codebelow:我编写了一个程序来从命令行获取输入参数并在 C 中创建一个基本的计算器。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
void CheckArgumentCount(int argc);
int CheckOperands(char *argv[]);
long Calculate(long nr1, long nr2, char operation);
int main(int argc, char *argv[])
{
long nr1 = CheckOperands(&argv[1]);
long nr2 = CheckOperands(&argv[3]);
int result;
CheckArgumentCount(argc);
result = Calculate(nr1, nr2, *argv[2]);
printf("Result: %d", result);
return 0;
}
void CheckArgumentCount(int argc)
{
if (argc > 3 || argc < 3)
{
puts("Wrong number of arguments to perform the calculation.\n");
}
}
int CheckOperands(char *argv[])
{
int i = 1;
while (*argv[i] != '\0')
{
if (*argv[i] < '0' || *argv[i] > '9')
{
return *argv[i];
}
argv++;
}
return atoi(argv[i]);
}
long Calculate(long nr1, long nr2, char operation)
{
long result = 0;
switch (operation)
{
case '+':
result = nr1 + nr2;
break;
case '-':
result = nr1 - nr2;
break;
case '*':
result = nr1 * nr2;
break;
case '/':
if (nr2 == 0)
{
puts("Error! Divion by zero.");
}
else
{
result = nr1 / nr2;
}
break;
default:
puts("Operator invalid.");
break;
}
return result;
}
Which compiles fine, as the compiler does not show any errors.哪个编译得很好,因为编译器没有显示任何错误。 However, I get this error on zsh terminal on run when I provide 3 arguments, eg:但是,当我提供 3 个参数时,我在运行时在 zsh 终端上收到此错误,例如:
zsh: segmentation fault ./calc 1 + 3
I assume it might have to do something with my CheckOperands function?我认为它可能与我的 CheckOperands 函数有关? Any advice will be appreciated.任何建议将被认真考虑。
You need to check the argument count before you use CheckOperands
, or rather before you dereference any argc[n]
with n > 1.在使用CheckOperands
之前,或者更确切地说,在使用 n > 1 取消引用任何argc[n]
之前,您需要检查参数计数。
You want this:你要这个:
int main(int argc, char* argv[])
{
if (!CheckArgumentCount(argc))
exit(1); // if argument count differenmt from 3 exit program
...
and this:和这个:
int CheckArgumentCount(int argc)
{
if (argc != 4) // argc is one more because if the command
invocation which is argv[0]
{
puts("Wrong number of arguments to perform the calculation.\n");
return 0;
}
return 1;
}
And there are more errors in CheckOperands
. CheckOperands
还有更多错误。
Overall corrected code:整体更正代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int CheckArgumentCount(int argc);
int CheckOperands(char* operand);
long Calculate(long nr1, long nr2, char operation);
int main(int argc, char* argv[])
{
if (!CheckArgumentCount(argc))
exit(1);
long nr1 = CheckOperands(argv[1]);
long nr2 = CheckOperands(argv[3]);
int result;
result = Calculate(nr1, nr2, argv[2][0]);
printf("Result: %d", result);
return 0;
}
int CheckArgumentCount(int argc)
{
if (argc != 4)
{
puts("Wrong number of arguments to perform the calculation.\n");
return 0;
}
return 1;
}
int CheckOperands(char* operand)
{
int i = 0;
while (operand[i] != '\0')
{
if (operand[i] < '0' || operand[i] > '9')
{
return operand[i];
}
i++;
}
return atoi(operand);
}
long Calculate(long nr1, long nr2, char operation)
{
long result = 0;
switch (operation)
{
case '+':
result = nr1 + nr2;
break;
case '-':
result = nr1 - nr2;
break;
case '*':
result = nr1 * nr2;
break;
case '/':
if (nr2 == 0)
{
puts("Error! Divion by zero.");
}
else
{
result = nr1 / nr2;
}
break;
default:
puts("Operator invalid.");
break;
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.