使用getopt处理必需参数

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 将只运行而没有参数。
我尝试了很多方法,但似乎无法使其正常工作。
任何帮助都将不胜感激。

1
提醒我不要调试使用变量 dflag 选项的代码和使用变量 rflag 选项的代码。 - Jonathan Leffler
@Jonathan:然后你去调试了它...只过了8分钟你就需要提醒了吗? - Michael Burr
我只是进行了全局搜索和替换。如果我使用xflag符号,那么x-x会匹配。否则,我将为控制变量使用更长、更有意义的名称,这些名称不一定与选项字母相关联。另一个大纲的问题是:“如果在输入-c后用户传递-d时使用了-a,那么将设置哪个变量?” - Jonathan Leffler
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 选项,则 dopt 值将永远不会被 getopt() 返回,因此该代码将不会执行。请注意,如果用户在输入 -c 之前输入 -d 选项,则 getopt() 在处理 -d 时将报告无效选项。您可以控制错误报告;您可能需要这样做。(optopt 变量包含遇到的实际选项字母作为无效。)
"will work" 选项是:
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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接