C语言中getopt()函数的用法[通俗易懂]

C语言中getopt()函数的用法[通俗易懂]1.getopt()函数getopt函数用来解析命令行选项,声明所在头文件为:#include<unistd.h>函数原型如下:intgetopt(intargc,char*constargv[],constchar*optstring);第一个参数argc是

大家好,又见面了,我是你们的朋友全栈君。

1.getopt()函数

getopt函数用来解析命令行选项,声明所在头文件为:

#include <unistd.h>

函数原型如下:

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

第一个参数argc是参数个数,和main函数的argc一样;

第二个参数argv是字符串指针,和main函数的argv一样;

第三个参数 optstring 是选项字符串,是本文所要讲述的重点。

2. optstring

选项字符串的内容如下:

  • 字符代表一个选项;
  • 没有冒号就表示纯选项,不需要参数;
  • 一个冒号代表该选项之后必须带有参数,可以使用空格,也可以不使用;
  • 两个冒号代表该项之后的参数可写可不写;

还有一些错误处理:

针对字符后无冒号的设定:

  • 不加空格带上参数后,会解析为这个两个独立选项合并;
  • 加上空格带上参数,会只解析出选项,忽略参数。

针对字符后一个冒号的设定:

  • 带上空格多加几个参数后,只解析第一个,其余忽略;
  • 如果不加参数,解析失败;

比如,"vha:b:c::"就表示:

  • 支持-v选项,通常用于打印版本号;
  • 支持-h选项,通常用于打印帮助信息;
  • 支持-a选项,后面必须带有一个参数;
  • 支持-b选项,后面必须带有一个参数;
  • 支持-c选项,后面可以带参数,也可以不用带参数;

3. 使用的全局变量

使用该函数时,会用到/设置四个全局变量:

extern char* optarg;

extern int optind;

extern int opterr;

extern int optopt;
  • optarg:用来保存选项的参数;
  • optind:用来记录下一个检索位置;
  • opterr:用来表示是否将错误信息输出到stderr;
  • optopt:表示不在选项字符串optstring中的选项;

4. 示例程序

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

int main(int argc, char * argv[])
{ 
   
    
    int ch;

    printf("初始值:optind = %d,opterr = %d\n", optind, opterr);

    while ((ch = getopt(argc, argv, "vha:b:c::")) != -1)
    { 
   
        printf("开始解析参数:optind = %d\n", optind);
        switch (ch) 
        { 
   
                case 'v':
                        printf("捕获到选项: -v\n");
                        printf("系统版本v1.1.0\n");   
                        break;
                case 'h':
                        printf("捕获到选项: -h\n"); 
                        printf("用法示例: -a 1 -b 2 -c [\"hello\"]\n");
                        break;
                case 'a':
                        printf("捕获到选项: -a\n");
                        printf("该选项参数为:%s\n\n", optarg);
                        break;
                case 'b':
                        printf("捕获到选项: -b\n");
                        printf("该选项参数为:%s\n\n", optarg);
                        break;
                case 'c':
                        printf("捕获到选项: -c\n");
                        printf("该选项参数为:%s\n\n", optarg);
                        break;
        }
    }
}

使用gcc编译:

gcc getopt_test.c -o getopt_test.o

单独测试每个选项:
C语言中getopt()函数的用法[通俗易懂]
C语言中getopt()函数的用法[通俗易懂]
C语言中getopt()函数的用法[通俗易懂]
C语言中getopt()函数的用法[通俗易懂]
C语言中getopt()函数的用法[通俗易懂]

测试都没有问题,接下来再看看几种错误的情况:

比如 -v 选项不需要参数,带个参数的结果如下:
C语言中getopt()函数的用法[通俗易懂]

再比如-a选项明确需要带一个参数,则带两个参数的结果如下:
C语言中getopt()函数的用法[通俗易懂]
如果不加参数,结果如下:
C语言中getopt()函数的用法[通俗易懂]

最后演示一个综合示例:
C语言中getopt()函数的用法[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135394.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm最新激活码2021 3月最新注册码[通俗易懂]

    pycharm最新激活码2021 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    50
  • AJAX常见面试问题[通俗易懂]

    AJAX常见面试问题[通俗易懂]1.工作当中会和后台交互吗? 那你能说说封装好的ajax里的几个参数吗 ?url: 发送请求的地址。type:请求方式(post或get)默认为get。async:同步异步请求,默认true所有请求均为异步请求。timeout:超时时间设置,单位毫秒data:要求为Object或String类型的参数,发送到服务器的数据cache:默认为true(当dataType为script时,…

    2022年8月25日
    3
  • mac idea2021 激活码(JetBrains全家桶)

    (mac idea2021 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~41MD…

    2022年3月30日
    217
  • mvc(1)——新建一个ASP.NET MVC项目

    mvc(1)——新建一个ASP.NET MVC项目一、新建一个空MVC项目  对于mvc的应用,我想第一步就应该是建立一个mvc项目了。废话不说了,直接上。  在“File(文件)”菜单中选择“New(新建)”——“Project(项目)”  打开“NewProject(新项目)”对话框。如果在左侧”VisualC#”目录树中选择”Web”模板,会看到”ASP.NETWebApplication(ASP.NETWeb应用程序)”项…

    2022年7月15日
    13
  • java笔试题库及答案,看完必懂

    java笔试题库及答案,看完必懂阿里面试总结1.一面首先确认对阿里的意向度;其次面试官会针对你曾经做过的项目来做具体技术的交流,你对项目细节是不是掌握到位,以及java技术基础和原理掌握程序,比如并发编程以及数据库和JVM三个方面,也会交流到分布式、线程池的实现等等(重点考察有没有深入钻研技术和技术上的亮点);2.二面技术面,根据项目深入的了解技术实力,了解你的知识面、问题解决能力以及技术灵活运用能力,也通过这一过程考察团队合作能力、学习主动性和创新性,可以挑选2-3个做过的有典型性的项目做一个仔细技术回顾和自己独到的理解(这是加

    2022年7月8日
    22
  • cpu overclocking_cpu memory overclocking

    cpu overclocking_cpu memory overclockingWhydoeskworkerhogyourCPU?TofindoutwhyakworkeriswastingyourCPU,youcancreateCPUbacktraces:watchyourprocessorload(withtoporsomething)andinmomentsofhighloadthroughkworker,executeechol>/proc/sysrq-triggertocreatea

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号