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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 思科自研芯片_新思科技是大公司吗

    思科自研芯片_新思科技是大公司吗https://www.toutiao.com/a6673484789430878728/3月15日,上海,由智东西主办、AWE和极果联合主办的GTIC2019全球AI芯片创新峰会成功举办!峰会现场延续上一届的火爆场景,全场从开幕到下午结束座无虚席,而且有不少热情观众坚持站着听完峰会全程。20位海内外AI芯片业界大咖齐聚一堂,围绕AI芯片在架构创新、生态构建、场景…

    2022年9月3日
  • windows下php7.1安装redis扩展以及redis测试使用全过程

    windows下php7.1安装redis扩展以及redis测试使用全过程

    2021年10月27日
  • AutoEventWireup介绍

    AutoEventWireup介绍       ASP.NET页会引发诸如Init、Load、PreRender等生命周期事件。默认情况下,可以使用Page_事件名称的命名约定将页事件绑定到方法。例如,若要为页的Load事件创建处理程序,可以创建名为Page_Load的方法。编译时,ASP.NET将查找基于此命名约定的方法,并自动执行事件与方法之间的绑定。可以对Page类公开的任何事件使用Page

    2022年5月8日
  • .NET软件工程师网络在线培训就业课程「建议收藏」

    .NET软件工程师网络在线培训就业课程「建议收藏」.NET软件工程师网络在线培训就业课程课程讲师:北风.NET专职讲师团队 课程分类:套餐适合人群:高级课时数量:2000课时用到技术:MVC5,EF6,BootStrap,HTML5,JqueryMobile,VS,.NET,ASP.NET 北风团队精心打造的42个经典案例,囊括了企业常见项目开发90%的典型应用 1、典型登录

    2022年7月19日
  • maven install 跳过 测试 test

    maven install 跳过 测试 testmaven install 跳过 测试 test

    2022年4月23日
  • 决策树的原理_决策树特征选择

    决策树的原理_决策树特征选择决策树的原理:根据树结构进行决策,可以用于分类和回归。一颗决策树包括一个根结点、若干个内部节点和若干个叶节点。从根节点出发,对每个特征划分数据集并计算信息增益(或者增益率,基尼系数),选择信息增益最大的特征作为划分特征,依次递归,直至特征划分时信息增益很小或无特征可划分,形成决策树。决策树优点1.计算复杂度不高;2.输出结果易于理解;3.不需要数据预处理;4…

    2022年9月3日

发表回复

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

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