11

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

编辑

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

编辑

我尝试输入命令参数--file,然后它起作用了。难道不能用 just 来做到这一点-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;  
    }
}
4

2 回答 2

20

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

optstring 是一个包含合法选项字符的字符串。如果这样的字符后跟一个冒号,则该选项需要一个参数,因此 getopt() 将指向同一 argv 元素中的以下文本的指针,或 optarg 中以下 argv 元素的文本。两个冒号表示一个选项带有一个可选参数;如果当前 argv 元素中有文本(即,与选项名称本身在同一个词中,例如“-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() 类似,但 '-' 和 "--" 可以表示长选项。如果以“-”(不是“--”)开头的选项不匹配长选项,但匹配短选项,则将其解析为短选项。

检查手册并尝试一下。

于 2013-07-26T09:25:25.397 回答
18

要指定一个标志需要一个参数,请在 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);
}
于 2013-07-26T09:40:15.540 回答