getopt函数的使用

C语言学习之getopt使用
一、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 参数说明:

argc:就是main的形参argc,表示参数的数量
argv:就是main的形参argv,表示参数的字符串变量数组
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)不带值的参数可以连写,像2和a是不带值的参数,它们可以-2 -a分开写,也可以-2a或-a2连写。
2)参数不分先后顺序,'-2a -b hello -cchello'和'-b hello -cchello -a2'的解析结果是一样的。
3)要注意可选值的参数的值与参数之间不能有空格,必须写成-cchello这样的格式,如果写成-c chello这样的格式就会解析错误
变量说明:

optarg:如果某个选项有参数,用于获取传入的参数值,包含当前选项的参数字符串
optind:argv 的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到
opterr:正常运行状态下为 0。非零时表示存在无效选项或者缺少选项参数,并输出其错误信息
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;
}

编译运行结果:

8d52847678974b37ad0af43dbc105b31.png

 

分析:

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

 

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值