头文件:
#include<unistd.h>
函数定义:
int getopt(int argc,char * const argv[ ],const char * optstring);
参数说明:
argc、argv: 由main函数参数直接传递过来。
optstring: 是一个包含合法选项字符的字符串。
如果字符后跟一个冒号,则要求该选项有参数。在argv中以“-”开头的都视为1选项,“- ”后的字符是选项字符。
补充说明:
getopt会返回在argv中的选项字符,此字符会对于optstring中的字符。如果getopt重复调用,它将返回下一个选项字符。如果不再有可识别的选项字符,则返回-1.
如果getopt找到另一个选项支付,则返回该字符,更新外部变量optind和静态变量nextchar,以便下次调用getopt可以重复实验接下来的选项字符。如果成功找到选项,getopt返回该选项字符。
如果所有命令行选项已被解析,getopt返回-1,如果getopt遇到一个选项字符不在optstring中,那么将返回“?”。
如果getopt遇到一个缺少参数的选项,则返回值取决于optstring中的第一个字符,如果是冒号,则返回“:”,返回返回“?”。
默认情况下,getopt会调换argv中的内容,将非选项放在最后。这样当getopts读取完所有的选项之后,optid会指向非选项的参数。
在处理选项列表时,getopt可以检测到两种错误
1.一个选项字符在optstring中并没有指定;
2.缺少选项参数。默认情况下,getopt在标准错误上输出错误信息,将错误的选项字符放在optopt中,并返回“?”作为函数结果。如果调用者将全局变量opterr设置为0,那么getopt不会输出错误信息(默认情况下,opterr是一个非零值)。如果optstring中的第一个字符是冒号“:”,那时getopt同样不会打印错误。另外getopt将返回“:”代替“?”以表示缺少选项参数。
getopt()所设置的全局变量包括:
1.char *optarg:当前选项参数;
2.int optind: 是argv中要处理的下一个元素的索引。系统初始化此值为1,调用者可以将其重置为1以重新开始扫描相同的argv,或扫描一个新的参数向量。每次调用getopt时,optind保持参数个数在argv中的所有(index)。如果找到一个选项,getopt会返回找到的选项的字符,更新optind。如果选项有参数,将参数存到optarg,否则optarg为0.
3.int opterr:这个变量为非零时, getopt为无效选项或缺少参数选项输出错误信息。
4.int optopt:当发现无效选项字符时,getopt返回”?”或“:”字符,并且optopt包含了所发现的无效选项字符。
getopt定义分为三种:
1.不带参数的选项;
2.必须带参数的选项,在选项后面加一个冒号。
3.可选参数的选项:在选项后加两个冒号。
注意事项:
1.不带参数的选项可以连写。
2.选项部分先后顺序。
3.可选参数的选项与参数之间不能有空格。
实例:
/* getopt.c */ #include<stdio.h> #include<unistd.h> int main(int argc, char **argv) { int ch; opterr = 0; while((ch = getopt(argc, argv, "a:bcde")) != -1) { switch(ch) { case 'a': printf("option a : '%s' ", optarg); break; case 'b': printf("option b:b "); break; default: printf("other option : %c ", ch); } printf("option + %c ", optopt); } return 0; }
实验结果