7

我目前的代码如下所示:

while (( flags = getopt(argc, argv, "abc")) != -1){
    switch(flags){
    case 'a':
        dflag = 1;
        break;
    case 'b':
        rflag = 1;
        break;
    case 'c':
        cflag = 1;
        break;
    }
}

问题是我想包含类似 testprogram -c -d 1

如果需要 c 来处理 -d,而没有 -c,则 testprogram -d 1 将仅在没有参数的情况下运行。

我尝试了各种各样的东西,但我似乎无法让它发挥作用。

任何帮助,将不胜感激。

4

1 回答 1

4

我认为您有两种选择,一种可行,另一种可能可行,也可能不可行。

“可能工作或可能不工作”选项将通过以下方式举例说明:

char *opts = "abc";
char *opts_d = "abcd:";

while ((opt = getopt(argc, argv, opts)) != -1)
{
    switch (opt)
    {
    case 'a':
        aflag = 1;
        break;
    case 'b':
        bflag = 1;
        break;
    case 'c':
        cflag = 1;
        opts = opts_d;
        break;
    case 'd':
        dflag = 1;
        dvalue = optarg;
        break;
    default:
        ...error handling...
        break;
    }
}

我不确定是否有任何东西阻止您在连续调用 [ 时更改有效选项列表getopt()][1],但我知道通常不会在您进行时更改选项。所以,谨慎对待。请注意,如果-c从未找到该选项,则 的optd将永远不会返回getopt(),因此不会执行其他代码。请注意,如果用户-d在 之前输入了一个选项-cgetopt()则在处理 时会报告一个无效选项-d。您可以控制错误报告;你可能不得不这样做。(该optopt变量包含实际遇到的无效选项字母。)

“将工作”选项是:

while ((opt = getopt(argc, argv, "abcd:")) != -1)
{
    switch (opt)
    {
    case 'a':
        aflag = 1;
        break;
    case 'b':
        bflag = 1;
        break;
    case 'c':
        cflag = 1;
        break;
    case 'd':
        if (cflag == 0)
            ...report error about must use -c option before -d option...
        dflag = 1;
        dvalue = optarg;
        break;
    default:
        ...error handling...
        break;
    }
}
于 2012-10-20T05:40:43.500 回答