【问题标题】:Supplying two arguments to command line option using getopt [duplicate]使用 getopt 为命令行选项提供两个参数 [重复]
【发布时间】:2011-12-19 09:36:03
【问题描述】:

在使用 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 第二个参数而不是命令参数。

【问题讨论】:

    标签: c getopt


    【解决方案1】:

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

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

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

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

    ./command -o key=value
    

    如果键集相对较小(如果键集较大,则效果不佳,但您可以不使用 getsubopt(),然后简单地将 optarg 解析为 =

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

    【讨论】:

      【解决方案2】:

      getopt 如何知道您的-o 选项在哪里结束,以及您的command arguments 从哪里开始?

      一个简单的解决方法是使用 -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
      

      【讨论】:

      • 我知道这种解决方法,但是由于两个选项参数绑定在一起(键值对),我无法将它们分开
      • 使用两个开关-ok key -ov val 并添加一些逻辑以确保它们以正确的顺序指定。或者查看我链接的上一个问题中的其他选项。
      猜你喜欢
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2018-05-24
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多