我对C中的getopt错误处理有疑问:
#include <unistd.h>
#include <getopt.h>
void showFunction()
{
printf("show function\n");
}
void printHelp()
{
printf("print help info\n");
}
#define HELP 1
#define SHOW_OPTION 2
int main(int argc, char *argv[])
{
const struct option long_opts[] = {{"help", no_argument, NULL, HELP},
{"show", no_argument ,NULL, SHOW_OPTION},
{NULL, 0, NULL, 0}};
int opt;
while((opt = getopt_long_only(argc, argv, "", long_opts, NULL)) != -1)
{
switch(opt) {
case HELP:
printHelp();
break;
case SHOW_OPTION:
showFunction();
break;
case '?':
printHelp();
break;
default:
printf("type base --help for details\n");
}
}
return 0;
}
这部分将处理一些错误:
case '?':
printHelp();
break;
但是如果我输入./base --
或./base -
或./base sdfs
或./base -- fsfs
,它就无法处理所有这些无效输入,那么如何处理上面的输入呢?有人可以帮忙吗?
答案 0 :(得分:0)
getopt
函数不仅支持选项(例如-h
或--help
),还支持所谓的非选项参数。例如。如果您编写./base --show arg1 arg2
,则--show
是一个选项,但arg1
和arg2
是非选项参数。此外,您可以在选项中明确地放置--
以显示这些破折号后的所有参数都是非选项参数。
在您的示例中,-
,sdfs
,fsfs
等选项是非选项参数。 getopt_longonly
(以及其他getopt
函数)将optind
extern变量设置为指向argv
数组中的第一个非选项元素。
让我们看看你的例子:
./base --
:由于--
是一个特殊选项,表明其后的所有内容都不是一个选项,因此该命令行完全有效,等于在没有任何选项的情况下调用./base
。
./base -
:变量optind
的值为1,argv[1]
为"-"
。它将单个短划线-
视为非选项参数。
./base -- fsfs
:此处--
被忽略,因为它表明之后只有非选项参数,而fsfs
是第一个非选项参数,因此{{1} }将等于2,optind
为argv[2]
。
如果您不想要任何非选项参数,只需检查"fsfs"
的值是否等于optind
。如果它小于argc
,则表示您有一些非选项参数:
argc