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


相关推荐

  • 难倒刘强东的奥数题,京东智能供应链解开了

    难倒刘强东的奥数题,京东智能供应链解开了原创:谭婧刘强东有几个问题,需要你帮忙做个决策:(一)到货快,花钱爽,建议商品离消费者越近越好。除了京东超级大仓库亚洲一号之外,得增加仓库数量,扩大仓库网络。而仓库又分一二三四好几级,一…

    2022年5月18日
    45
  • 计算机中1kb表示的字节数是多少_在计算机中1KB是指几字节

    计算机中1kb表示的字节数是多少_在计算机中1KB是指几字节大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。1kb等于1024个字节。kB(Kilobyte),是一种资讯计量单位,是计算机数据存贮器存储单位字节的多倍形式。现今通常在标识内存等具有一般容量的储存媒介之储存容量时使用。根据国际单位制标准,1kB=1000B(字节,Byte)。根据按照IEC命名标准,用于二进制存储单位的标准命名是KiB,MiB等,1kiB=1024B。这是由…

    2022年9月30日
    2
  • c++入门教程–-11递归

    c++入门教程–-11递归

    2021年3月12日
    344
  • 创建eureka注册中心_微服务注册中心和网关

    创建eureka注册中心_微服务注册中心和网关目录关于SpringCloud版本单机模式Eureka注册中心搭建引入Eureka-Server依赖创建启动类添加配置高可用Eureka注册中心搭建双节点注册中心修改配置文件修改hosts文件启动测试多节点注册中心修改配置文件启动测试常见问题参考文章SpringCloud是一系列框架的集合,它利用SpringBoot的开发便利性巧…

    2022年8月21日
    5
  • html左右循环滚动代码,不间断循环滚动效果的实例代码(必看篇)

    html左右循环滚动代码,不间断循环滚动效果的实例代码(必看篇)滚动测试/***@paraobj目标对象如:demo,deml1,demo2中的”demo”可任意,只要不重复**@paraspeed滚动速度越大越慢**@paradirection滚动方向包括:left,right,down,up**@paraobjWidth总可见区域宽度**@paraobjHeight总可见区域高度**@parafilePath存…

    2022年7月18日
    55
  • php 抽象工厂模式

    php 抽象工厂模式/*抽象工厂模式:用来生成一组相关或相互依赖的对象。抽象工厂模式与工厂方法模式的区别:抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽

    2022年7月25日
    8

发表回复

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

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