【问题标题】:How could one determine that required argument of option is missing?如何确定选项所需的参数缺失?
【发布时间】:2017-03-02 23:21:41
【问题描述】:

我在 GNU/Linux 机器上使用getopt_long。 将选项列表初始化为:

static struct option long_options[] = {
     {"mode", required_argument, 0, 9},
     {0, 0, 0, 0}
};

有以下代码行

c = getopt_long(argc, argv, "", long_options, index_ptr);

当我使用命令运行程序时:

prog --mode

上面显示的代码行返回“?”在 c 中,但不是 ':' 根据getopt(3) 手册页的预期:"错误和 -1 返回是 与 getopt() 相同"

是的,当使用/解析短选项时,可以在选项列表中写入类似“:m:”的内容,因此缺少参数的变量 c 将包含 ':',而不是 '?',但是在解析 only 长选项时应该如何区分两种情况(缺少参数、无效选项)?

如何区分无效选项和缺少必需参数的选项?

【问题讨论】:

  • 为什么在 long_options 数组中使用 9 作为要返回的 val 而不是字符 '9' 以及为什么 optstring/shortopts 参数不包含 "9:" ? (见Example of Parsing Long Options
  • @DavidBowling .val 是一个int,但主要在.flag 指针不为NULL 时使用。因为9 不能用于检测快捷方式参数,所以最好使用'm' 之类的字符(用于模式)。
  • 是的,我在提问之前阅读了 glibc 参考手册的 getopt[_long] 部分。但目前尚不清楚在这种情况下应该返回什么。
  • @Piquard,它们返回什么并不重要,因为我想区分两种错误情况(缺少参数,无效选项)并且我只想解析长选项。

标签: c linux getopt-long command-line-arguments


【解决方案1】:

我认为实现区分无效选项和缺少参数的有效选项的唯一方法是将选项结构的has_arg 字段设置为optional_argument,然后手动测试争论。那么getopt_long() 只会返回一个值'?'当存在无效选项时,您可以通过查看optarg 来检查指定选项是否有参数。这是一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int main(int argc, char *argv[])
{
    int i, opt;
    int index = -1;

    static struct option long_options[] = {
        {"mode", optional_argument, NULL, 'm'},
        {0, 0, 0, 0}
    };

    /* suppress error messages */
    //opterr = 0;

    while ((opt = getopt_long(argc, argv, "", long_options, &index)) != -1) {
        if (opt == '?') {
            /* do something, perhaps: */
            //printf("Invalid option \n");
            //      exit(EXIT_FAILURE);
        }
        if (opt == 'm' && optarg == NULL) {
            printf("Missing argument in '--mode' option\n");
            exit(EXIT_FAILURE);
        }        
    }

    return 0;
}

【讨论】:

  • 我也想过,问题是如果有很多选项,比如--mode,带有if条件的主体会增长。
  • @BulatM.-- 你考虑过使用Argp 吗?它看起来比getopt 风格的函数更复杂一些,但看起来更灵活。它也许能做你想做的事。
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2011-01-14
  • 2011-08-13
  • 2012-05-09
  • 2017-02-27
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多