处理分段错误,访问不存在的命令行参数

时间:2013-09-29 22:59:32

标签: c command-line

我正在Linux环境下用C语言编写程序。现在,程序使用我在命令行中提供的参数运行。

例如:

./programName -a 45 -b 64

我想在错误地提供命令行参数时处理这种情况。比如说,只有'a'和'b'是有效参数,而且除此之外的字符是错误的。我处理了这个案子。但是假设我的命令行参数是这样的:

./programName -a 45 -b

它给出了分段错误(核心转储)。我知道为什么它给出了因为b之后没有参数。但是我怎么能处理这种情况,这样当这个条件到来时,我可以在屏幕上打印一条错误信息并退出我的程序。

2 个答案:

答案 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()或等效选项解析函数的代码相比,此类代码更容易受到此类问题的影响。