头文件:

#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'\n", optarg);
                break;
            case 'b':
                printf("option b:b\n");
                break;
            default:
                printf("other option : %c\n", ch);
        }
        printf("option + %c\n", optopt);

    }
    return 0;
}

 

实验结果

getopt()函数_错误信息