你怎么处理getopt中的参数乱序?

时间:2013-09-22 17:54:58

标签: c command-line-arguments getopt

我的代码使用getopt从命令行获取参数。我希望能够获得三个必需的参数,以及一个可选的第四个参数。我们分别称这些输入A和B ./ main string1 string2 filename ./ main -n 3 string1 string2 filename

我被告知可选参数不需要放在开头,所以以下内容也应该有用。我们称之为输入C ./ main string1 string2 -n 3 filename 。请注意,其他3个参数必须按顺序排列。这是我遇到麻烦的部分。

目前,我的代码如下所示:

int c;
int n;
while ((c = getopt(argc,argv,"n:"))!=-1) {
    printf("Loop\n");
    switch (c) {
            case 'n':
                cvalue = optarg;
                n = atoi(optarg);
                break;
            case '?':
                break;
            default:
                break;
    }
}

如果我输入B,代码就可以工作,即进入循环并将输入正确分配给n。但是,如果我输入C,它甚至不进入循环,即它似乎甚至没有在参数中注册-n 3。这是预期的行为,还是我在代码中遗漏了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

getopt()实现“标准”命令行结构,即所有选项都在所有参数(ref)之前。并非所有的Unix命令都遵循这个“标准”;如果你的命令需要偏离,你可以手动解析argv [],而不需要getopt()函数。来自man 3 getopt:

If there are no more option  characters,  getopt()  returns  -1.   Then
optind  is  the  index in argv of the first argv-element that is not an
option.