0

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

例如:

./programName -a 45 -b 64

我想处理错误提供命令行参数的情况。说,只有“a”和“b”是有效的参数,除此之外的字符是错误的。我处理了这个案子。但是假设我的命令行参数是这样的:

./programName -a 45 -b

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

4

2 回答 2

2

根据主要功能维基页面

参数 argc,参数计数和 argv,参数向量,分别

所以你可以使用你的 argc 参数来检查你是否有正确数量的参数。如果你没有 4,处理它并继续没有段错误。

于 2013-09-29T23:03:33.323 回答
0

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

于 2013-09-29T23:26:02.807 回答