在写一些可执行程序时,常常会传递一些参数。getopt函数就是专门用来处理选项参数的。
#include <unistd.h>
extern char *optarg;
extern int optind, opterr, optopt;
int getopt(int argc, char * const argv[], const char *optstring);
argc和argv就是命令行传入的参数。
optstring是支持的选项列表。具体规则如下:
- 单一字符(如:"abc")。表示支持的选项,后面无参数。
- 字符后面跟上冒号(如:"a:b:c:")。表示后面必须跟一个参数,可以紧跟在后面,也可以以空格隔开。例如传参"-a 10 -b20"。此时变量optarg就指向参数位置。
- 字符后面跟两个冒号(如:"a::")。表示后面必须跟一个参数,且不能以空格隔开。如:"-a20"。此时变量optarg就指向参数位置。
optarg、optind、opterr、optopt:
- optarg:当选项后面跟参数时,此指针指向参数。
- optind:这个变量表示当前要处理的参数在argv参数列表中的需要,初始值是1。总之argv[optind]始终是指向下一次要解析的参数序号。
- opterr:表示错误值。
- optopt:指向当前选项。比如-a,则optopt就是97.
当getopt解析到一个并不在optstring中的选项时,或者一个必须跟参数的选项后面没有参数时,其返回值就是'?'(0x3f)。optopt指向当前的选项。
了解了上面的接口和相关参数,就可以通过循环调用getopt来解析一长串的参数。
#include <unistd.h>
#include <stdio.h>
#include <string.h>
extern int optind, opterr, optopt;
extern char* optarg;
void show_help(char* exe)
{
printf("Usage: %s -<w/r> [info]\r\n");
}
void main(int argc, char* argv[])
{
int ch;
printf("optind = %d.\r\n", optind);
while ((ch = getopt(argc, argv, "w:rh::")) != -1) {
printf("optind = %d.\r\n", optind);
switch (ch) {
case 'w':
printf("get w. optarg = %s. optind = %d\r\n", optarg, optind);
break;
case 'r':
printf("get r. optarg = %s\r\n", optarg);
break;
case 'h':
printf("get h.\r\n");
break;
default:
printf("default ch = %d. optopt = %d\r\n", ch, optopt);
break;
}
}
printf("end.\r\n");
}
运用好optind、optarg变量,再加上一些具体应用所需的策略,即可完成对命令行参数的解析。