2013-03-25 105 views
0

我想在参数后得到更多的optargs,但我不知道如何去做。我想打电话给我的程序,如如何使用optarg获取多个值?

./test -a first second -b third 

我现在只能在参数-a之后获得一个值。当我尝试放置两个或更多时,avalue为空。

我的代码:

char *avalue = NULL; 
    char *bvalue = NULL; 
    while ((c = getopt (argc, argv, "a:b:")) != -1) 
    switch (c) 
     { 
     case 'a': 
     avalue = optarg; 
     break; 
     case 'b': 
     bvalue = optarg; 
     break; 
     case '?': 
     if (optopt == 'c') 
      fprintf (stderr, "Option -%c requires an argument.\n", optopt); 
     else if (isprint (optopt)) 
      fprintf (stderr, "Unknown option `-%c'.\n", optopt); 
     else 
      fprintf (stderr, 
        "Unknown option character `\\x%x'.\n", 
        optopt); 
     return 1; 
     default: 
     abort(); 
     } 

    printf ("avalue = %s\nbvalue = %s\n",avalue, bvalue); 
+0

你不能那样做。 GNU getopt认为你的命令行与'test -a first -b third-second'没什么不同。充其量,你可以期待'测试 - 第一个 - 第二 - 第三个第三'工作。 – 2013-03-25 10:45:04

+0

是不是有办法如何让这些值“非法”?该程序将被称为这样,所以我必须找到一种方法。 – 2013-03-25 10:52:42

+0

我有一个包叫做'ngxgetopt'(下一代扩展getopt),它可以在'-a'之后配置为需要2个选项,等等。它旨在统一一组逆向和异常的命令行解析技术,同时尊重原来的调用约定。如果需要,请通过电子邮件与我联系(请参阅我的个人资料)。这不重要(1500行代码,150行标题,93 KiB gzipped tar文件);附带一个实质测试套件和关于选项约定的丰富文档。 – 2013-03-25 10:57:59

回答

1

这种传统的格式需要至多一个参数到每个标志。你不能改变它。

但是,取决于你的shell,你可以使用引号“组”多令牌成一个参数:

./test -a "first second" -b third 

该组将采取你的shell之前,即内部发生参数被发送到您的程序。

+0

另一种可能是'getsubopt()'...在这种情况下可能不是,但值得一提。 – 2013-03-25 10:52:18