使用getopt_long处理用户错误

时间:2014-10-03 03:39:26

标签: c

如何处理用户只在参数的长版本之前输入一个短划线的情况?

例如,使用-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;
}

1 个答案:

答案 0 :(得分:2)

除了手动解析命令行之外,没有办法做到这一点。 getopt_long()假设长选项以--开头,如果您不想要--,则不会尝试输入长选项。在任何情况下,对于用户是否确实忘记了-,或者用户是否真的认为有py短选项,并且没有程序区分这两种情况的方式。

但是,如果需要,您可以做的是将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;
}

并输出:

paul@local:~/src/sandbox$ ./go -copy
Copy
paul@local:~/src/sandbox$