代码的最后面有解释说明,直接上代码:
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
extern char* optarg;
extern int optind;
extern int opterr;
extern int optopt;
const char getopt_str[] = "hab:c::";
static struct option long_options[] =
{
{"version", no_argument, 0, 'v' },
{"size", required_argument, 0, 's' },
{"file", optional_argument, 0, 'f' },
};
int main(int argc, char *argv[])
{
int opt = 0;
int longindex = 0;
while((opt = getopt_long(argc, argv, getopt_str, long_options, &longindex)) != -1)
{
switch (opt)
{
case 'h':
printf("opt is h:\n");
printf("./a.out -h -a -b 11 -caa --version --size 123 --file=a.out\n");
break;
case 'a':
printf("opt is a:\n");
break;
case 'b':
printf("opt is b:\n");
printf("b arg is:%s\n", optarg);
break;
case 'c':
printf("opt is c:\n");
printf("c arg is:%s\n", optarg);
break;
case 'v':
printf("opt is %s:\n", long_options[longindex].name);
printf("%s arg is:%s\n", long_options[longindex].name, optarg);
break;
case 's':
printf("opt is %s:\n", long_options[longindex].name);
printf("%s arg is:%s\n", long_options[longindex].name, optarg);
break;
case 'f':
printf("opt is %s:\n", long_options[longindex].name);
printf("%s arg is:%s\n", long_options[longindex].name, optarg);
break;
default:
break;
}
}
return 0;
}
#if 0
全局变量:
optarg:指向当前选项对应的参数地址
optind:表示的是下一个将被处理到的参数在argv中的下标值。
opterr:如果opterr = 0,在getopt、getopt_long、getopt_long_only遇到错误将不会输出错误信息到标准输出流。opterr在非0时,向屏幕输出错误。
optopt:表示没有被未标识的选项。
optstring:短选项字符串
hab:c::
表示短选项h、a后面没有参数 注:选项后面没有冒号就表示没有参数
表示短选项b后面肯定有一个参数。其形式可以表示为 "-b123" 或者 "-b 123" 注:选项后面一个冒号,就表示必须要跟参数
表示短选项c后面可以跟参数也可以不跟参数。如果跟参数,短选项c和参数之间不能有空格。 其形式必须是 "-carg" 比如:"-c123" 注:选项后面两个冒号,就表示可以有参数也可以没有参数。
struct option
{
const char *name; //长选项的名字 比如 --file a.txt name就是file --file=a.txt name就是file
int has_arg; //长选项后面是否跟参数 no_argument/0:长选项后面不跟参数 required_argument/1: 长选项后面跟参数,参数格式“--参数 值” 或者 “--参数=值” optional_argument/2:长选项后面跟参数,参数格式只能是“--参数=值”
int *flag; //标志。flag为空时,getopt_long返回结构体val的值。 flag不为空时,getopt_long将返回0,flag指针将指向val值。
int val; //flag为空时,val就是就是getopt_long的返回值。flag不为空时,val的地址就是就是flag指针指向的地址
};
#include <unistd.h>
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
argc:参数的个数
argv:保存参数的二维数组
optstring:短选项字符串
longopts:长选项结构体
longindex:如果longindex非空,那么改指针指向的内存用于保存找到的longopts的下标值。
#endif
编译:gcc getopt_long.c
执行:
./a.out -h
或者
./a.out -ah -b 11 -caa --version --size 123 --file=a.out
程序输出:
qidong.liu@cqrnd01:~/lqd/c/get_opt$ gcc getopt_long.c
qidong.liu@cqrnd01:~/lqd/c/get_opt$ ./a.out -h
opt is h:
./a.out -h -a -b 11 -caa --version --size 123 --file=a.out
qidong.liu@cqrnd01:~/lqd/c/get_opt$ ./a.out -ah -b 11 -caa --version --size 123 --file=a.out
opt is a:
opt is h:
./a.out -h -a -b 11 -caa --version --size 123 --file=a.out
opt is b:
b arg is:11
opt is c:
c arg is:aa
opt is version:
version arg is:(null)
opt is size:
size arg is:123
opt is file:
file arg is:a.out
qidong.liu@cqrnd01:~/lqd/c/get_opt$
全局变量:
optarg:指向当前选项对应的参数地址
optind:表示的是下一个将被处理到的参数在argv中的下标值。
opterr:如果opterr = 0,在getopt、getopt_long、getopt_long_only遇到错误将不会输出错误信息到标准输出流。opterr在非0时,向屏幕输出错误。
optopt:表示没有被未标识的选项。
optstring:短选项字符串
hab:c::
表示短选项h、a后面没有参数 注:选项后面没有冒号就表示没有参数
表示短选项b后面肯定有一个参数。其形式可以表示为 "-b123" 或者 "-b 123" 注:选项后面一个冒号,就表示必须要跟参数
表示短选项c后面可以跟参数也可以不跟参数。如果跟参数,短选项c和参数之间不能有空格。 其形式必须是 "-carg" 比如:"-c123" 注:选项后面两个冒号,就表示可以有参数也可以没有参数。
struct option
{
const char *name; //长选项的名字 比如 --file a.txt name就是file --file=a.txt name就是file
int has_arg; //长选项后面是否跟参数 no_argument/0:长选项后面不跟参数 required_argument/1: 长选项后面跟参数,参数格式“--参数 值” 或者 “--参数=值” optional_argument/2:长选项后面跟参数,参数格式只能是“--参数=值”
int *flag; //标志。flag为空时,getopt_long返回结构体val的值。 flag不为空时,getopt_long将返回0,flag指针将指向val值。
int val; //flag为空时,val就是就是getopt_long的返回值。flag不为空时,val的地址就是就是flag指针指向的地址
};
#include <unistd.h>
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
argc:参数的个数
argv:保存参数的二维数组
optstring:短选项字符串
longopts:长选项结构体
longindex:如果longindex非空,那么改指针指向的内存用于保存找到的longopts的下标值。