【问题标题】:Using getopt for required arguments对所需参数使用 getopt
【发布时间】:2012-10-20 05:23:00
【问题描述】:

我目前的代码如下所示:

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 将只运行不带参数。

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

任何帮助将不胜感激。

【问题讨论】:

  • 提醒我不必调试使用变量dflag 用于-a 选项和变量rflag 用于-b 选项的代码。
  • @Jonathan:然后你去调试了……8分钟后你需要提醒吗?
  • 我只是做了一个全局搜索和替换。如果我使用xflag 表示法,x-x 匹配。否则,我将为控制变量使用更长、更有意义的名称,这些名称不一定与选项字母相关。大纲的另一个问题是'如果在指定-a 时使用dflag,当用户在输入-c 后传递-d 时将设置什么变量?'

标签: c arguments getopt


【解决方案1】:

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

“可能有效或无效”选项的示例如下:

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 变量包含实际遇到的无效选项字母。)

“将起作用”选项是:

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2013-11-05
    • 2013-02-26
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多