getopt函数用来解析命令行选项,声明所在头文件为:
#include <unistd.h>
函数原型如下:
int getopt(int argc, char * const argv[], const char *optstring);
第一个参数argc是参数个数,和main函数的argc一样;
第二个参数argv是字符串指针,和main函数的argv一样;
第三个参数 optstring 是选项字符串,是本文所要讲述的重点。
2. optstring选项字符串的内容如下:
- 字符代表一个选项;
- 没有冒号就表示纯选项,不需要参数;
- 一个冒号代表该选项之后必须带有参数,可以使用空格,也可以不使用;
- 两个冒号代表该项之后的参数可写可不写;
还有一些错误处理:
针对字符后无冒号的设定:
- 不加空格带上参数后,会解析为这个两个独立选项合并;
- 加上空格带上参数,会只解析出选项,忽略参数。
针对字符后一个冒号的设定:
- 带上空格多加几个参数后,只解析第一个,其余忽略;
- 如果不加参数,解析失败;
比如,"vha:b:c::"
就表示:
- 支持-v选项,通常用于打印版本号;
- 支持-h选项,通常用于打印帮助信息;
- 支持-a选项,后面必须带有一个参数;
- 支持-b选项,后面必须带有一个参数;
- 支持-c选项,后面可以带参数,也可以不用带参数;
使用该函数时,会用到/设置四个全局变量:
extern char* optarg;
extern int optind;
extern int opterr;
extern int optopt;
- optarg:用来保存选项的参数;
- optind:用来记录下一个检索位置;
- opterr:用来表示是否将错误信息输出到stderr;
- optopt:表示不在选项字符串optstring中的选项;
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int ch;
printf("初始值:optind = %d,opterr = %d\n", optind, opterr);
while ((ch = getopt(argc, argv, "vha:b:c::")) != -1)
{
printf("开始解析参数:optind = %d\n", optind);
switch (ch)
{
case 'v':
printf("捕获到选项: -v\n");
printf("系统版本v1.1.0\n");
break;
case 'h':
printf("捕获到选项: -h\n");
printf("用法示例: -a 1 -b 2 -c [\"hello\"]\n");
break;
case 'a':
printf("捕获到选项: -a\n");
printf("该选项参数为:%s\n\n", optarg);
break;
case 'b':
printf("捕获到选项: -b\n");
printf("该选项参数为:%s\n\n", optarg);
break;
case 'c':
printf("捕获到选项: -c\n");
printf("该选项参数为:%s\n\n", optarg);
break;
}
}
}
使用gcc编译:
gcc getopt_test.c -o getopt_test.o
单独测试每个选项:
测试都没有问题,接下来再看看几种错误的情况:
比如 -v 选项不需要参数,带个参数的结果如下:
再比如-a选项明确需要带一个参数,则带两个参数的结果如下:
如果不加参数,结果如下:
最后演示一个综合示例: