Linux c中使用 getopt_long 处理输入参数

#include <getopt.h>

int getopt_long(
int argc,
char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex);
optstring:短选项字符串
longopts指针指向 struct option 数组的第一个元素
longindex是 struct option 数组的索引
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
*name 长选项
has_arg 有三种方式:no_argument/required_argument/optional_argument
no_argument(或者是0)时 ——参数后面不跟参数值,eg: –version,–help
required_argument(或者是1)时 ——参数输入格式为:–参数 值 或者 –参数=值。eg:–dir=/home
optional_argument(或者是2)时 ——参数输入格式只能为:–参数=值

*flag: 一般设定为NULL,而且把val的值设置成跟短选项一样的值
val:长选项在被解析的时候返回的值,或者是加载flag所指向的变量。

形式如“a:b::cd:“,分别表示程序支持的命令行短选项有-a、-b、-c、-d,冒号含义如下:
(1)只有一个字符,不带冒号——只表示选项, 如-c
(2)一个字符,后接一个冒号——表示选项后面带一个参数,如-a 100
(3)一个字符,后接两个冒号——表示选项后面带一个可选参数,即参数可有可无, 如果带参数,则选项与参数之间不能有空格
形式应该如-b200

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

void usage()
{
printf(“Usage:\n”
“–help -h\n”
“–width -w\n”
“–height -h\n”
“–format -f\n”);
}
static struct option const long_options[] =
{
{“help”, no_argument, NULL, ‘H’},
{“height”, required_argument, NULL, ‘h’},
{“width”, required_argument, NULL, ‘w’},
{“format”, required_argument, NULL, ‘f’},
{NULL, 0, NULL, 0}
};
int parse_args(int argc,char **argv);
int parse_args(int argc,char **argv)
{
int c;
int width=0;
int height=0;
int longindex=0;
char format[64]=”NV12″;
while ((c = getopt_long (argc, argv, “Hh:w:f:”, long_options, &longindex)) != -1)
{
switch (c)
{
case ‘h’:
height=atoi(optarg);
break;
case ‘w’:
width=atoi(optarg);
break;
case ‘f’:
memset(format,0,sizeof(format));
sprintf(format,”%s”,optarg);
break;
case ‘H’:
usage();
exit(0);
case ‘?’:
usage();
exit(0);
default:
usage();
exit(0);
}
}
printf(“format: %s\n”,format);
printf(“width: %d\n”,width);
printf(“height: %d\n”,height);
return 0;
}
int main(int argc, char **argv)
{
printf(“%s\n”,”Hello World!”);
parse_args(argc,argv);
return 0;
}