您可以而且很可能应该使用getopt()
GNU brethren 或它的 GNU brethren 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()
或等效选项解析函数的代码更容易受到此类问题的影响。