[英]error handling of getopt in C
我对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
,它不能处理所有那些无效的输入,那么如何处理上面的输入呢? 有人可以帮忙吗?
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
是第一个非选项参数,因此optind
等于2,而argv[2]
为"fsfs"
。
如果您不希望任何非选项参数,只需检查optind
的值等于argc
。 如果小于argc
则表示您有一些非选项参数:
if (optind < argc) {
/* at least one non-option argument exists */
printHelp();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.