getopt函数示例

https://www.cnblogs.com/oloroso/p/4616282.html

http://blog.sina.com.cn/s/blog_c2ce93e90101gxwh.html

https://blog.csdn.net/qq_33850438/article/details/80172275)

相关函数表头文件:

    #include<unistd.h>

定义函数:

    int getopt(int argc,char* const argv[],const char* optstring);

    extern char *optarg;

    extern int optind,opterr,optopt;

几个全局变量的含义:

    1、变量optind是getopt要处理的argv中的下一个字符串参数的索引。optind被系统初始化为1,我们可以将它重新赋值为1,从而可以重新开始扫描指针数组argv。默认值为1。

    2、opterr控制getopt函数是否打印出错信息(当命令行选项不包括在optstring中或者缺少必要的参数时,会向stderr打印错误信息)。如果不希望打印出错信息,则只要将全局变量opterr设为0即可,反之设为1。默认值为1。

    3、optarg:选项的参数指针,在检索到合法的选项字符之后,指向该字符后面的参数。

    4、optopt:当命令行选项字符不包括在optstring中或者命令行选项字符包括在optstring中但是缺少必要的参数时,该选项存储在optopt中,getopt返回'?'。如果命令行包括在optstring中,但是缺少必要的参数,而且optstring的第一个字符是":",则此时返回的就是":"(默认为"?"),我们可以输出此值作为诊断信息。

函数说明:
getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring则代表欲处理的选项字符串。此函数会返回在argv中下一个的选项字母,此字母会对应参数optstring中的字母。如果选项字符串里的字母后面接着冒号":",则表示还有相关的参数,全局变量optarg即会指向此额外参数。如果getopt()找不到符合的参数则会打印出错信息,并将全局变量optopt设为"?"字符。如果不希望getopt()打印出错信息,则只要将opterr设为0即可。

短参数的定义:

   getopt()使用optstring所指的字串作为短参数列表,像"1ac:d::"就是一个短参数列表。短参数的定义是一个'-'后面跟一个字母或数字,像-a,-b就是一个短参数。每个数字或字母定义一个参数。

   其中短参数在getopt()定义里分为三种:

   1、不带值的参数,它的定义即是参数本身;

   2、必须带值的参数,它的定义是在参数本身后面再加一个冒号;

   3、可选值的参数,它的定义是在参数本身后面加两个冒号;

   在这里拿上面的"1ac:d::"作为样例进行说明,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。

   在实际调用中,"-1 -a -c cvalue -d","-1 -a -c cvalue -ddvalue","-1a -ddvalue -c cvalue"都是合法的。这里需要注意三点:

   1、不带值的参数可以连写,像1和a是不带值的参数,可以-1 -a分开写,也可以-1a或-a1连写。

   2、参数不分先后顺序,"-1a -c cvalue -ddvalue","-ddvalue -c cvalue -a1"的解析结果是一样的。

   3、要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析出错。

返回值:

   getopt()每次调用会逐次返回命令行传入的参数。

   当没有参数的最后的一次调用时,getopt()将返回-1。

   当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回"?"。

   当optstring是以":"开头时,缺值参数的情况下会返回":",而不是"?"。

#include <unistd.h>
#include <stdio.h>

void usage(char *prg)
{
    printf("Show how 'getopt' works/n");
    printf("usage: %s  [-a 1] [-b 2] [-c 3] [-d] arg1 arg2/n/n", prg);
    printf("input whatever, eg: %s -a 1 arg2 -c 2 arg1 -b 3/n", prg);
}

int main(int argc, char * argv[])
{
    if(argc < 3)
    {
        usage(argv[0]);
        return -1;
    }

    int ch;
    while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)
    {
        printf("optind: %d ", optind);
        switch (ch)
        {
            case 'a':
                  printf("HAVE option: -a ");  
                  break;
            case 'b':
                  printf("HAVE option: -b ");
                  printf("The argument of -b is %s ", optarg);
                  break;
            case 'c':
                  printf("HAVE option: -c ");
                  printf("The argument of -c is %s ", optarg);
                  break;
            case 'd':
                printf("HAVE option: -d ");
                break;
            case 'e':
                printf("HAVE option: -e ");
                printf("The argument of -e is %s ", optarg);
                break;
            case '?':
                printf("Unknown option: %c ",(char)optopt);
                break;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容