2014-10-03 71 views
0

我该如何处理用户在参数的长版本之前只输入一个破折号的情况?使用getopt_long处理用户错误

例如,运行我的程序与-copy

 
$ my_program -copy 
Copy 
Open 
my_program: invalid option -- p 
Unknown 

它是在执行o选项的问题。我的目标是显示一个错误报告,这是一种心态,“你在一个短划线之后键入了多个字符”。

代码

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

int main(int argc, char *argv[]) 
{ 
    struct option options[] = 
    { 
    {"open", no_argument, 0, 'o'}, 
    {"copy", no_argument, 0, 'c'}, 
    {0, 0, 0, 0} 
    }; 

    int c; 
    int option_index = 0; 
    while ((c = getopt_long(argc, argv, "oc", options, &option_index)) != -1) 
    { 
    switch (c) 
    { 
    case 'o': 
     printf("Open\n"); 
     break; 
    case 'c': 
     printf("Copy\n"); 
     break; 
    default: 
     printf("Unknown\n"); 
     return 0; 
    } 
    } 

    return 0; 
} 
+0

如果您不希望单个字母的选项不明确,不指定它们。或者等到您执行任何操作之前解析了所有选项。 – 2014-10-03 04:22:29

回答

2

没有办法比手动解析命令行来做到这一点其他的。 getopt_long()的工作原理是长选项以--开头,如果您不想要--,则不会尝试输入长选项。在任何情况下,用户是否确实忘记了-,或者用户是否真的认为有短期选项,并且程序没有办法区分这两种情况,那么最好不过是含糊不清。

你可以做些什么,但如果需要的话,可以用getopt_long()代替getopt_long_only(),它允许用一个单独的-指定长选项。在您的特定情况下,-copy将被接受为--copy的替代选项,因此您不需要报告错误。显然你会增加这种模糊匹配的可能性。

修订代码:

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

int main(int argc, char *argv[]) { 
    struct option options[] = { 
     {"open", no_argument, 0, 'o'}, 
     {"copy", no_argument, 0, 'c'}, 
     {0, 0, 0, 0} 
    }; 

    int c; 
    int option_index = 0; 
    while ((c = getopt_long_only(argc, argv, "oc", 
           options, &option_index)) != -1) { 
     switch (c) { 
     case 'o': 
      printf("Open\n"); 
      break; 
     case 'c': 
      printf("Copy\n"); 
      break; 
     default: 
      printf("Unknown\n"); 
      return 0; 
     } 
    } 

    return 0; 
} 

输出:

[email protected]:~/src/sandbox$ ./go -copy 
Copy 
[email protected]:~/src/sandbox$