C语言学习——getopt()

C语言学习之getopt使用


在Linux中我们经常见到执行命令时,需要输入参数,例如 rm -rf folder中的 -rf就属于输入的参数,其中 -r是:递归处理, 将指定目录下的所有文件与子目录一并处理; -f是强制删除文件或目录。在看开源代码时也应该会经常见到 getopt()

一、getopt介绍

getopt() 方法是用来分析命令行参数的,该方法由 Unix 标准库提供,包含在 <unistd.h> 头文件中。

getopt()函数结构定义

#include <unistd.h>
 
int getopt(int argc, char * const argv[], const char *optstring);
 
extern char *optarg;
extern int optind, opterr, optopt;

int main(int argc, char* argv[]){
	//getopt()
}

getopt 参数说明:

  1. argc:就是main的形参argc,表示参数的数量
  2. argv:就是main的形参argv,表示参数的字符串变量数组
  3. optstring:选项字符串,一个字母表示一个短参数,如果字母后带有“:”,表示这个参数必须带有参数。如"a:b:c",则程序可以接受参数"-a 10 -b 1000 -c"
    注意:其中短参数在getopt定义里分为三种:
    1)不带值的参数,它的定义即是参数本身。
    2)必须带值的参数,它的定义是在参数本身后面再加一个冒号。
    3)可选值的参数,它的定义是在参数本身后面加两个冒号 。

这里用"2ab:c::"作为样例说明,其中的2,a是不带值的参数,b是必须带值的参数,c是可选值的参数。
在实际调用中,可以写成'-2 -a -b hello -c',或者 '-2 -a -b bhello -cchello', 或者'-2a -bhello -cchello'
这里需要注意:
  1)不带值的参数可以连写,像2a是不带值的参数,它们可以-2 -a分开写,也可以-2a-a2连写。
  2)参数不分先后顺序,'-2a -b hello -cchello''-b hello -cchello -a2'的解析结果是一样的。
  3)要注意可选值的参数的值与参数之间不能有空格,必须写成-cchello这样的格式,如果写成-c chello这样的格式就会解析错误

变量说明:

  1. optarg:如果某个选项有参数,用于获取传入的参数值,包含当前选项的参数字符串
  2. optind:argv 的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到
  3. opterr:正常运行状态下为 0。非零时表示存在无效选项或者缺少选项参数,并输出其错误信息
  4. optopt:当发现无效选项字符之时,getopt()函数或返回’?‘字符,或返回’:'字符,并且optopt包含了所发现的无效选项字符

二、举例子说明

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]) {
    int para;
    const char *optstring = "abc:d::"; // 有三个选项-abc,其中c选项后有冒号,所以后面必须有参数,d是选参
    while ((para = getopt(argc, argv, optstring)) != -1) {
        switch (para) {
            case 'a':
                printf("parameter opt is a, oprarg is: %s\n", optarg);
                break;
            case 'b':
                printf("parameter opt is b, oprarg is: %s\n", optarg);
                break;
            case 'c':
                printf("parameter opt is c, oprarg is: %s\n", optarg);
                break;
            case 'd':
                printf("parameter opt is d, oprarg is: %s\n", optarg);
                break;
            case '?':
                printf("error optopt: %c\n", optopt);
                printf("error opterr: %d\n", opterr);
                break;
        }
    }
    return 0;
}

编译运行结果:
在这里插入图片描述
分析:

注意这里可选参数 选项 -d 后面跟参数的时候,一定不能有空格。
但是如果是 必选参数,即选项后面只有一个冒号,则是有没有空格都可以。
getopt()每次调用会逐次返回命令行传入的参数。
  当没有参数的最后的一次调用时,getopt()将返回-1。
  当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回’?’。
  当optstring是以’:‘开头时,缺值参数的情况下会返回’:’,而不是’?’ 。

推荐文章

[1]https://blog.csdn.net/afei__/article/details/81261879
[2]: https://blog.51cto.com/vopit/440453
[3]: https://www.cnblogs.com/yinghao-liu/p/7123622.html
2021-09-02。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值