我正在Linux环境下用C语言编写程序。现在,程序使用我在命令行中提供的参数运行。
例如:
./programName -a 45 -b 64
我想在错误地提供命令行参数时处理这种情况。比如说,只有'a'和'b'是有效参数,而且除此之外的字符是错误的。我处理了这个案子。但是假设我的命令行参数是这样的:
./programName -a 45 -b
它给出了分段错误(核心转储)。我知道为什么它给出了因为b之后没有参数。但是我怎么能处理这种情况,这样当这个条件到来时,我可以在屏幕上打印一条错误信息并退出我的程序。
答案 0 :(得分:2)
根据the main function wiki page:
参数argc,参数计数和argv,参数向量分别为
因此,您可以使用argc参数来检查您是否拥有正确数量的参数。如果你没有4,请处理它并在没有segfault的情况下继续。
答案 1 :(得分:0)
您可以,而且很可能应该使用getopt()
或其GNU兄弟getopt_long()
。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int b = 0;
int a = 0;
int opt;
while ((opt = getopt(argc, argv, "a:b:")) != -1)
{
switch (opt)
{
case 'a':
a = atoi(optarg);
break;
case 'b':
b = atoi(optarg);
break;
default:
fprintf(stderr, "Usage: %s -a num -b num\n", argv[0]);
exit(1);
}
}
if (a == 0 || b == 0)
{
fprintf(stderr, "%s: you did not provide non-zero values for both -a and -b options\n", argv[0]);
exit(1);
}
printf("a = %d, b = %d, sum = %d\n", a, b, a + b);
return(0);
}
您可以根据需要使错误检测更加聪明,不允许重复,发现额外的参数,允许零通过等。但关键是getopt()
将禁止您的有问题的调用。
我们无法看到您的代码出现了什么问题,因为您没有显示它,但是如果您访问不存在的参数(例如argv[4]
运行./programName -a 42 -b
),那么你得到核心转储。有些人手工编写选项解析代码;与使用getopt()
或等效选项解析函数的代码相比,此类代码更容易受到此类问题的影响。