在讨论这个函数之前我们先理解两个概念:选项及其参数
gcc -o program program.c
在上述命令中 -o 就是其选项 program就是参数。
getopt();
头文件:
#include<unistd.h>
函数原型:
int getopt(int argc,char * const argv[ ],const char * optstring);
argc为参数个数,argv是一个指针数组。
外部变量
extern char *optarg; //选项的参数指针,指向下一个要扫描的参数
extern int optind, //索引为下一个要处理的指针的下标
extern int opterr, //当opterr=0时,getopt不向stderr输出错误信息;相反,不为0,就会向sterr打印一条错误信息
extern int optopt; //用于储存错误或不可知的信息,当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt,getopt返回问号(?)。
optstring参数所做的规定
1.单个字符,表示选项,
2.单个字符后接一个冒号(:)表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3 单个字符后跟两个冒号(::),表示该选项后的参数可有可无。如果有,则参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。
e.g.
/*getopt.c*/
1 #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int opt;
while((opt=getopt(argc,argv,"ab:c::"))!=-){
switch(opt){
case 'a':
printf("option: %c\n",opt);
break;
case 'b':
printf("optarg1: %s\n",optarg);
break;
case 'c':
printf("optarg2: %s\n",optarg);
break;
case '?':
printf("unknown option :%c\n",optopt);
break;
}
}
for(;optind<argc;optind++)
printf("argument: %s\n",argv[optind]);
exit();
}
编译 gcc -o getopt getopt.c
第一次运行 ./getopt -a -b “i am ok” -c
结果
option: a
optarg1: i am ok
optarg2: (null)
第二次运行 ./getopt -a -b “i am ok” -c”I AM OK”
结果
option: a
optarg1: i am ok
optarg2: I AM OK