告诉getopt它未完成解析选项

时间:2018-09-29 21:12:40

标签: c getopt

我正在使用getopt来解析选项。我解析的选项之一(-a)具有强制性参数。

我的getopt调用看起来像这样:

while((c = getopt(argc, argv, "a:b")) != -1) {
    switch(c) {
    case 'a':
        foo = atoi(optarg);
        break;
        ...
    }
}

这是我的问题:

假设某人运行./my-command -a100b。我想让我的程序告诉我们,有一个-a选项,参数为100 有一个-b选项。但是,getopt将其解析为带有参数-a的{​​{1}}选项。

如何告诉getopt尚未解析100b?我想告诉getopt从字符-a100b开始解析,以便它识别出有一个b选项。

1 个答案:

答案 0 :(得分:2)

  

假设某人运行./my-command -a100b。我想让我的程序告诉   有一个-a选项,参数为100 有一个-b选项。   但是,getopt将其解析为带有参数-a的{​​{1}}选项。

是的,确实如此。这就是100b解析的选项语言的工作方式。

  

如何告诉getopt尚未解析getopt()?我想要   告诉getopt从字符-a100b开始解析,以便它识别   有一个b选项。

不能。 POSIX标准-b或我所知的任何扩展版本(例如GNU的扩展版本)均不支持这种功能。特别是,POSIX specficiation for getopt部分说来

  

getopt()函数是一个命令行解析器,应遵循   XBD Utility中的实用程序语法准则3、4、5、6、7、9和10   语法准则。

Those guidelines关于命令行选项以及它们的格式。与您的问题最相关的是:

  

准则3:       每个选项名称应为可移植字符集中的单个字母数字字符(字母数字分类)。 [...]

     

准则4:       所有选项均应以'-'分隔符开头。

     

准则5:       在以下情况下,应接受一个或多个没有选项参数的选项,然后是最多一个带有选项参数的选项   分组在一个'-'分隔符后面。

     

准则6:       每个选项和选项参数都应该是一个单独的参数,除非实用程序参数语法的项目(2)中有说明。

请特别注意准则5:将选项组合在一起时,只有最后一个可能带有参数。这样一来,该组的尾部或下一个完整参数就可以解释为参数,这就是您看到的getopt()的作用。

当然,如果您希望程序接受不符合POSIX准则的选项,则可以随意这样做,但是您可能需要执行自己的选项解析。也许您可以获得getopt的帮助,但是您需要在顶部添加一个平凡的自定义解析层。从头开始自己滚动可能会更容易。