C语言中getopt()函数的用法

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

#include <unistd.h>
1
函数原型如下:

int getopt(int argc, char * const argv[], const char *optstring);
1
第一个参数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


单独测试每个选项:

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

比如 -v 选项不需要参数,带个参数的结果如下:


再比如-a选项明确需要带一个参数,则带两个参数的结果如下:

 

如果不加参数,结果如下:


最后演示一个综合示例:

 

————————————————
版权声明:本文为CSDN博主「Mculover666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Mculover666/article/details/106646339

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值