getopt函数为C语言程序中提供命令行开关的标准程序接口。实际作用是解析命令行参数。
#include<unistd.h> int getopt(int argc,char *const argv[],const char *opstring); extern char *optarg; extern int optind,opterr,optopt;
getopt函数将传递给程序mian()函数的argc,argv作为参数,同时接受一个指定指定符字符串optstring。函数getopt()认为optstring中,以‘-’开头的字符为命令行参数选项,有的参数选项后面可以跟参数值,optstring中的格式规范如下:
1) 单个字符,表示选项,
2) 单个字符后接一个冒号”:”,表示该选项后必须跟一个参数值。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3) 单个字符后跟两个冒号”::”,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
getopt(argc,argv,"ab:cd");
上面例子允许几个选项-a -b -c -d 其中-b 后面需要跟一个参数
那么解析命令行参数通常通过循环来一次得到每个选项。
如果选项中有这个关联值,那么就是上面提到的外部变量optarg来指向这个值。
如果选项处理完毕那么函数getopt返回-1,特殊参数“--”将使getopt停止扫描选项。
如果遇到无法识别的选项,getopt返回一个问号(?),并保存到外部变量optopt中。
如果一个选项要求有一个关联值(例如上面例子的-b),但是用户没有提供这个值,getopt通常返回一个问号(?),如果我们将字符串第一个字符设置为冒号(:),那么用户将在用户没提供值的情况下返回冒号(:),而不是问号(?)。
现在我们已知的变量有optarg(指向外部变量),optopt保存无法识别的参数项,还有optind,为下一个待处理参数的所以。getopt用他来记录自己的进度。此外还有些getopt版本会在遇到未知选项时打印出错信息。如果opterr变量是非零值,getopt就会向stderr打印一条出错信息。