#include <unistd.h>
int getopt(int argc, char * const argv[],const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
描述:该函数用于解析命令行参数。
如果argv的一个元素以'-'(且不是'-'或'--')开头,那么这个元素的'-'字符之后的字符表示一个选项。如果重复调用该函数,将会依次返回argv中所找到的选项。optind,它指向argv列表中下一个需要被解析的元素的位置,系统将它初始化为1,调用者可以通过重新扫描相同的argv列表来将它设置为1,或者扫描新的argv列表。
如果该函数找到了选项字符,它会返回这个字符,然后更新optind和一个静态可变参数nextchar,所以继续调用该函数时,都会返回选项或者下一个argv元素。
如果后续没有选项参数了,该函数返回-1,然后optind会指向argv中第一个不是选项的元素。
opttring是一个由合理的选项字符组成的字符串。如果其中有字符后跟着冒号,则说明这个选项请求一个参数,所以该函数会将这个选项所在元素的后续字符串或者紧随其后的元素的地址放到optarg中,作为这个选项的参数。如果后面跟着两个冒号,说明请求一个可选参数,如果该选项后跟有参数,则放入optarg中,如果没有,optarg被置空(eg. -oarg arg是o选项的参数)。如果optstring中带有W,并以分号结尾,那么-W foo将被视为长选项 --foo
默认情况下,该函数会将所有扫描的选项排序,不是选项的参数作为结尾。并且这个函数支持了两种模式:选项的第一个字符是‘+’或者环境变量POSIXLY_CORRECT被设置的情况下,则检查到最近的非选项参数直接退出。如果第一个字符是'-',每个非选项元素作为一个代码为1的选项的参数。如果一道'--'将会强制结束扫描
在检查参数选项列表argv时,该函数可以检查出两种错误:
1)一个不存在于optstring中的选项;
2)一个缺失参数的选项。
这两种情况下会有以下行为:
1)默认情况下,该函数在标准错误输出上打印错误信息,将错误的选项字符放置到optopt中,然后在函数结束的时候,返回'?'
2)如果调用者设置过全局变量opterr为0,该函数将不会打印错误信息,调用者可以通过opterr决定函数结束时返回的字符信息
3)如果optstring的第一个字符是':',该函数不会打印错误信息,会返回':'表示选项缺少参数,可以来区分两种不同的错误。
参数:
int argc:它的argc参数是argv列表中包含的参数的计数,就像是main函数在工程中被调用。
char *const argv[]:参数列表。
const char *optstring:指定了需要检查的选项字符
返回值:
成功,则返回解析的选项字符
如果全部解析完毕,则返回-1
如果遇到一个不是optstring中指定的选项,则会返回?
如果遇到一个缺少参数的选项,要根据optstring中第一个字符来决定返回什么,第一个字符为:,就返回:,其它情况都返回?
函数测试代码如下:
#include <iostream>
#include <unistd.h>
using namespace std;
int main(int argc,char *argv[]){
char ch = 0;
while(-1 != (ch = getopt(argc,argv,":a:bc"))){
cout << ch << endl;
}
return 0;
}