C 告诉getoptit';“未完成解析”选项

C 告诉getoptit';“未完成解析”选项,c,getopt,C,Getopt,我正在使用getopt解析选项。我解析的选项之一(-a)有一个强制参数 我的getopt调用如下所示: while((c = getopt(argc, argv, "a:b")) != -1) { switch(c) { case 'a': foo = atoi(optarg); break; ... } } 我的问题是: 假设有人运行/my命令-a100b。我想让我的程序告诉我有一个-a选项,带有一个参数100和一个-b

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

我的getopt调用如下所示:

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

假设有人运行
/my命令-a100b
。我想让我的程序告诉我有一个
-a
选项,带有一个参数100和一个
-b
选项。但是,getopt将其解析为一个带有参数
100b
-a
选项

我如何告诉getopt它还没有完成解析
-a100b
?我想告诉getopt从字符
b
开始解析,以便它识别出有一个
-b
选项

假设有人运行
/my命令-a100b
。我想让我的程序告诉你 有一个带参数100的
-a
选项和一个
-b
选项。 但是,getopt将其解析为一个带有参数
100b
-a
选项

是的。这就是
getopt()
解析的选项语言的工作原理

我如何告诉getopt它还没有完成解析
-a100b
?我想 告诉getopt在字符
b
处开始解析,以便它能够识别 有一个
-b
选项

你不能。POSIX标准
getopt()
和我所知道的任何扩展版本(例如GNU)都不支持这样的事情。特别是,报告部分说,

getopt()
函数是应遵循的命令行解析器 XBD实用程序中的实用程序语法指南3、4、5、6、7、9和10 语法指南

是关于命令行选项及其格式的。与您的问题最相关的是:

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

准则4: 所有选项前面都应该有“-”分隔符

准则5: 在以下情况下,应接受一个或多个不带选项参数的选项,后跟最多一个带选项参数的选项: 分组在一个“-”分隔符后面

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

请特别注意准则5:当您将选项组合在一起时,只有最后一个选项可能包含参数。这允许将该组的尾部或下一个完整参数解释为参数,这就是您看到的
getopt
所做的


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

不,没有办法。这不是它设计用来支持的选项语法
getopt
解析与POSIX标准选项一致,这与标准不一致。它如何知道参数在
100
之后结束,并且不包括
b
?与什么向后兼容?如果已经有一个实现使用了这种语法,那么为什么不能使用它的解析器,而不是将它硬塞进
getopt
?我以为你想让
getopt
为你做这件事,而不是自己做。你不能两全其美。如果使用
getopt
,则仅限于标准选项语法。如果您想要非标准的选项语法,您必须使用自定义解析器。谢谢!这很有帮助。我很欣赏对指南中特定部分和可操作建议的引用;它没有数字选项参数的概念,因此除了作为
-a
选项的选项参数的由4个字符组成的字符串外,它不可能将
100b
识别为其他任何内容。无论命令行是否包含
-a100b
-a 100b
,这都适用。目前尚不清楚OP将如何使用
-100b
作为两个参数,但
getopt()
将其视为传递与
-a100b
相同的信息。