如何处理用户只在参数的长版本之前输入一个短划线的情况?
例如,使用-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 :(得分:2)
除了手动解析命令行之外,没有办法做到这一点。 getopt_long()
假设长选项以--
开头,如果您不想要--
,则不会尝试输入长选项。在任何情况下,对于用户是否确实忘记了-
,或者用户是否真的认为有p
和y
短选项,并且没有程序区分这两种情况的方式。
但是,如果需要,您可以做的是将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$