C 告诉getoptit';“未完成解析”选项
我正在使用getopt解析选项。我解析的选项之一(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
-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
相同的信息。