6

使用 getopt 时,是否有另一种方法可以将两个参数作为单个字符串传递给选项?通常我会做以下事情:

./command -o "key value" [command arguments]

然后我将不得不明确拆分参数字符串

 while ((op = getopt(argc, argv, "o:")) != EOF) {
    switch (op) {
             case 'o': 
                 char* result = NULL;
                 result = strtok_r(optarg," ");
                 while(result) {
                     /* DO STUFF */
                     result = strtok(NULL," ");
                 }

                 break;
             default:
                 printUsage()
                 break;
   }

所以,我想知道是否可以执行以下操作:

./command -o key value [command arguments]

使 getopt 将“值”视为 -o 第二个参数而不是命令参数。

4

2 回答 2

12

POSIX 标准getopt()不支持单个标志字母的多个参数。有几个选项可供您使用。

一种选择是将名称指定为分隔选项字母的参数(或使用相同的字母两次):

./command -o key -v value
./command -o key -o value

另一种选择是使用 POSIX 标准getsubopt()和命令行符号,例如:

./command -o key=value

如果键集相对较小(如果键集很大,则效果不佳,但您可以不这样做,只需为自己getsubopt()解析即可。optarg=

另一种选择是编写一个命令行解析器,它可以根据需要接受多个参数。我写了一个能够解析我们在工作中使用的程序的多样化和不规范的参数处理 - 这并不是非常困难(尽管它也不是很容易)。它特别必须在单个标志之后处理 N (N > 1) 选项值。如果您想查看来源,请与我联系(请参阅我的个人资料)。有一些棘手的问题需要解决,例如,如果您希望选项字母后面有 3 个名称,但前三个参数之一以 dash 开头-,或者--出现,会发生什么情况。我只允许固定数量的参数,而不是可变数量,但这部分是因为我的用例不需要涵盖可变数量(听起来也不像你的那样)。

于 2011-12-19T22:37:31.430 回答
1

怎么getopt知道你的-o选择在哪里结束,你从哪里command arguments开始?

一种简单的解决方法是使用 to-o说明符:

$ cat t.c
#include<stdio.h>
#include<getopt.h>

int main(int argc, char **argv)
{
    char op;
    while ((op = getopt(argc, argv, "o:")) != EOF) {
        switch (op) {
            case 'o':
                printf("Option: %s\n", optarg);
                break;
            default:
                break;
        }
    }
}
$ gcc t.c
$ ./a.out -o one -o two -o three
Option: one
Option: two
Option: three
于 2011-12-19T09:48:26.743 回答