函数 —— 分析命令行参数 getopt() getopt_long() getopt_long_only()

本文详细介绍了getopt()和getopt_long()函数在解析命令行参数时的功能、使用方法、常见错误及其处理。重点讲解了optstring的含义、全局变量optarg、optind、opterr和optopt的作用,以及如何处理无法识别的选项和丢失选项参数的错误。同时,提到了getopt_long()的长参数处理和结构体option的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么需要命令行解析函数?
只按顺序处理参数的话,一些“可选参数”的功能将很难实现。
在Linux中,我们可以使用getopt、getopt_long、getopt_long_only来对这个问题进行处理
为什么是三个函数?
因为这三个函数的分工不同:
getopt()是获取短参数的:
        可以获取-a,-l类型的短参数,也可以-name合并的获取到-n -a -m -e到optstring中匹配;
getopt_long()是获取长参数的:
        还可以获取--name这种参数,当-name时,会拆成-n -a -m -e到optstring中进行匹配;
getopt_long_only()是获取长参数的,与getopt_long()使用相同的参数表:
        可以获取--name或者-name两种选项都当做长参数来匹配;
        当遇到-name长参数时,不能在longopts中匹配时才将其拆分成-n -a -m -e到optsing中进行匹配。

getopt()函数

1、功能描述;

     getopt - parse command options (enhanced)  (解析命令选型(增强))

2、表头文件:

       #include<unistd.h>

3、定义函数:

        int getopt(int argc, char * const argv[] ,const char * optstring);

         extern char *optarg;
         extern int optind, opterr, optopt;

4、optstring中的内容的意义:

        字符串参数optstring -- optstring是由选项Option字母组成的字符串

        例如:getopt(argc,argv,"ab:c:de::")

        1、单个字符,[a] [b] [c] [d] [e], 表示选项;

        2、单个字符后接一个冒号 ':' , [b:]  [c:] ,表示该选项后必须跟一个参数。

                                参数紧跟在选项后或或者以空格隔开,参数的指针赋值给optarg;

        3、单个字符后有两个冒号 '::' ,[ e:: ],表示该选项后可以跟一个参数,也可以不跟。

                            如果跟一个参数,参数必须紧跟在选项后不能以空格隔开,参数指针赋值给optarg(未赋值 optarg = NULL);

5、getopt设置的全局变量:

        optarg——指向当先选项的参数(如果有)的指针;(当匹配一个选项后,如果该选项带选项参数,则optarg指向选项参数字符串;若该选项不带选项参数,则optarg为NULL;若该选项的选项参数为可选时,optarg为NULL表明无选项参数,optarg不为NULL时则指向选项参数字符串。)

        optind——再次调用getopt()时的下一个argv指针的索引;(一个待处理元素在argv中的索引值。即下一次调用getopt的时候,从optind存储的位置处开始扫描选项。当getopt()返回-1后,optind是argv中第一个Operands的索引值。optind的初始值为1。

        opteer——opterr的值非0时,在getopt()遇到无法识别的选项,或者某个选项丢失选项参数的时候,getopt()会打印错误信息到标准错误输出。opterr值为0时,则不打印错误信息。opterr默认为1。

        optopt——最后一个未知选项。(在上述两种错误之一发生时,一般情况下getopt()会返回'?',并且将optopt赋值为发生错误的选项。 

来看个实例,我们定义字符串参数为const char *optstring = "a:b:c::d";
从前面的知识点,我们很容易得出结论:
        选项a,b是必须要加一个参数的;        
        选项c的选项参数是可选的,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值