Getopt-传递参数的字符串参数

时间:2013-07-26 09:12:42

标签: c getopt

我有一个程序,它接受多个命令行参数,所以我使用getopt。我的一个参数将字符串作为参数。无论如何通过getopt函数获取该字符串还是必须通过argv []数组获取它?也可以像-file那样读取args吗?我到目前为止看到的所有论据只有一个字符,例如-a

修改

从下面的答案中我编写了一个程序来使用getopt_long(),但是当我使用字符参数而不是long参数时,switch语句只识别参数。我不确定为什么会这样。在传递参数-mf -file sample时,我没有看到打印语句。

修改

我尝试输入命令参数为--file,然后就可以了。是否不能仅使用-file执行此操作?

static struct option long_options[] =
{
    {"mf", required_argument, NULL, 'a'},
    {"md", required_argument, NULL, 'b'},
    {"mn", required_argument, NULL, 'c'},
    {"mw", required_argument, NULL, 'd'},
    {"lf", required_argument, NULL, 'e'},
    {"ld", required_argument, NULL, 'f'},
    {"ln", required_argument, NULL, 'g'},
    {"lw", required_argument, NULL, 'h'},
    {"rf", required_argument, NULL, 'i'},
    {"rd", required_argument, NULL, 'j'},
    {"rn", required_argument, NULL, 'k'},
    {"rw", required_argument, NULL, 'l'},
    {"df", required_argument, NULL, 'm'},
    {"dd", required_argument, NULL, 'n'},
    {"dn", required_argument, NULL, 'o'},
    {"dw", required_argument, NULL, 'p'},
    {"file", required_argument, NULL, 'q'},
    {NULL, 0, NULL, 0}
};
int ch=0;
while ((ch = getopt_long(argc, argv, "abcdefghijklmnopq:", long_options, NULL)) != -1)
{
    // check to see if a single character or long option came through
        switch (ch){
        case 'a':
            cout<<"title";
            break;
        case 'b':

            break;
        case 'c':

            break;
        case 'd':

            break;
        case 'e':

            break;
        case 'f':

            break;
        case 'g':

            break;
        case 'h':

            break;
        case 'i':

            break;
        case 'j':

            break;
        case 'k':

            break;
        case 'l':

            break;
        case 'm':

            break;
        case 'n':

            break;
        case 'o':

            break;
        case 'p':

            break;
        case 'q':
            cout<<"file";
            break;
        case '?':
            cout<<"wrong message"
            break;  
    }
}

2 个答案:

答案 0 :(得分:18)

阅读man getopt http://linux.die.net/man/3/getopt

  

optstring是一个包含合法选项字符的字符串。如果   这样的字符后跟一个冒号,该选项需要一个   参数,所以getopt()放置一个指向以下文本的指针   相同的argv-element,或以下argv-element的文本   OPTARG。两个冒号意味着一个选项需要一个可选的arg;如果有   当前argv-element中的文本(即与选项相同的单词)   自己命名,例如“-oarg”),然后在optarg中返回,   否则optarg设置为零。

示例代码:

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
  int opt;
  while ((opt = getopt (argc, argv, "i:o:")) != -1)
  {
    switch (opt)
    {
      case 'i':
                printf ("Input file: \"%s\"\n", optarg);
                break;
      case 'o':
                printf ("Output file: \"%s\"\n", optarg);
                break;
    }
  }
  return 0;
}

这里optstring是“i:o:”字符串中每个字符后面的冒号':'字符表示这些选项需要参数。您可以在optarg全局变量中找到参数作为字符串。有关详细信息和更多示例,请参见手册。

对于多个字符选项开关,请参阅长选项getopt_long。查看手册以获取示例。

编辑以回应单个' - '长选项:

从手册页

  

getopt_long_only()与getopt_long()类似,但“ - ”和“ - ”可以表示长选项。如果选项以' - '开头   (不是“ - ”)与长选项不匹配,但匹配短选项,   它被解析为一个简短的选项。

检查手册并试一试。

答案 1 :(得分:14)

要指定标志需要参数,请在short_opt变量中的标志后面添加一个“:”。要使用长参数,请使用getopt_long()。

这是一个快速示例程序:

#include <getopt.h>
#include <stdio.h>

int main(int argc, char * argv[]);

int main(int argc, char * argv[])
{
   int             c;
   const char    * short_opt = "hf:";
   struct option   long_opt[] =
   {
      {"help",          no_argument,       NULL, 'h'},
      {"file",          required_argument, NULL, 'f'},
      {NULL,            0,                 NULL, 0  }
   };

   while((c = getopt_long(argc, argv, short_opt, long_opt, NULL)) != -1)
   {
      switch(c)
      {
         case -1:       /* no more arguments */
         case 0:        /* long options toggles */
         break;

         case 'f':
         printf("you entered \"%s\"\n", optarg);
         break;

         case 'h':
         printf("Usage: %s [OPTIONS]\n", argv[0]);
         printf("  -f file                   file\n");
         printf("  -h, --help                print this help and exit\n");
         printf("\n");
         return(0);

         case ':':
         case '?':
         fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
         return(-2);

         default:
         fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c);
         fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
         return(-2);
      };
   };

   return(0);
}