日常开发中,会经常对命令行参数进行处理,当参数比较少的时候,可以手动处理,但是当参数过多的时候就要使用getopt来处理了。
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
getopt() 所设置的全局变量包括:
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个argv指针的索引,即表示的是下一个将被处理到的参数在argv中的下标值。
optopt——最后一个未知选项。
opterr——如果指定此值为0,getopt、getopt_long、getopt_long_only遇到错误将不会输出错误信息到标准输出流。
从最简单的getopt讲起,getopt函数的前两个参数,就是main函数的argc和argv,这两者直接传入即可,要考虑的就只剩下第三个参数。
optstring字符串的意义如下:比如:getopt(argc, argv, "ab:c:de::");
1.单个字符,表示选项(如下例中的abcde各为一个选项)。比如:./a.out -a
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg(如下例中的b:c:)。比如:./a.out -b zhang
3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)。./a.out -ezhang
上面这个optstring在传入之后,getopt函数将依次检查命令行是否指定了 -a, -b, -c及 -d(这需要多次调用getopt函数,直到其返回-1),当检查到上面某一个参数被指定时,函数会返回被指定的参数名称(即该字母)
-mnbn相当于-m -n -b n
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
int main(int argc, char *argv[])
{
int opt;
char *optstring = "ab:c::d:";
// opterr = 0;
while ((opt = getopt(argc, argv, optstring)) != -1)
{
printf("opt = %c\n", opt);
printf("optarg = %s\n", optarg);
printf("optind = %d\n", optind);
printf("argv[optind - 1] = %s\n", argv[optind - 1]);
printf("optopt = %c\n", optopt);
}
return 0;
}
程序运行结果为: