getopt 和 getopt_long 命令行解析函数

简介:

        getopt()和getlopt_long()是用来解析命令行参数的。getopt()只能用来处理短选项,如:test -h,而getlopt_long()既可以处理短选项也可以处理长选项,如:test --help。

-a、-A、-b都表示短选项,--all、--author、--almost-all 都表示长选项。

一、getopt函数

1、头文件

#include <getopt.h>
#include <stdlib.h>
#include <unistd.h>

2、函数介绍

2.1 原型

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

功能:用来解析命令行选项参数,只适用于短选项:-d /root; 不能解析长选项--arch, --help等

参数介绍:

  • argc是参数个数;
  • argv是参数的字符串数组(不要忘记argv[0]是"./可执行文件名");
  • 而第三个参数optstring就是选项字符串。

返回值:

  • 选项解析成功,返回这个选项字符
  • 若解析完毕,则返回-1或者EOF。
  • 若选项未定义,则提示错误信息,并返回'?'

2.2 optstring字符串格式介绍

  • 单个字符:表示没有参数
  • 单个字符跟1个冒号:表示必须有参数,格式:-d xxx或者-dxxx
  • 单个字符跟2个冒号:表示参数可有可无,格式:-d 或者 -dxxx

举例:

char *optstring="ab:c::";

运行程序可以给最多三个参数,分别为-a,-b和-c,其中

a选项 :因为没有跟冒号,不能有参数,如:-a

b选项 :因为后面跟了1个冒号必须有参数,如:-b 100

c选项 :因为跟了2个冒号,参数可有可无,如:-c 100 或 -c 都行

2.3 函数全局变量

变量名称作用
char* optarg
指向当前解析的选项参数的指针
int optind

记录当前已遍历选项的索引,方便下次调用时直接找到下一个选项

举例:  ./test -a 1 -b 2
        最初还未解析时,optind为1,因为-a的下标为1,
        解析完-a后optind的值就变为3,因为-b的下标为3,
        解析完-b后,optint变为5,但argv[5]为空,说明解析完毕,此时getopt函数便返回-1。
int opterr
在非0时会将错误信息标准输出到显示屏,但若被设为0,将不会输出错误信息
int optopt
若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符?,同时将optopt设为该选项

3、示例

#include <stdio.h>
#include <unistd.h>
#include <getopt.h>

void main(int argc, char **argv)
{
        int flags, opt;

        while((opt = getopt(argc, argv, "ab:c::")) != -1){

                switch(opt){
                case 'a':
                        printf("Input %d parameter is -a=%s\n", optind, optarg);
                        break;
                case 'b':
                        printf("Input %d parameter is -b=%s\n", optind, optarg);
                        break;
                case 'c':
                        printf("Input %d parameter is -c=%s\n", optind, optarg);
                        break;
                default:
                        printf("Not match!!!");
                }
        }

        return ;

}

运行结果:

$ ./getopt_test -a -b 123 -c456
Input 2 parameter is -a=(null)
Input 4 parameter is -b=123
Input 5 parameter is -c=456

二、getopt_long函数

1、函数原型

int getopt_long(int argc, char * const argv[], const char *optstring,const struct option *longopts, int *longindex);

1.1 对比 getopt_long 和 getopt 差异

新增参数:

  • longopts:长选项参数的名称、属性、以及解析后的返回值等结构信息        

struct option {
        const char  *name;     /* 参数名称 */
        int has_arg;                /* 指明是否带有参数 */             
        int *flag;                      /* flag=NULL时,返回value;不为空时,*flag=val,返回0 */  
        int val;                        /* 用于指定函数找到选项的返回值或flag非空时指定*flag的值 */
};

        has_arg表示选项后面是否携带参数

配置说明举例
no_argument不带参数如: --version,--help
required_argument必须带参数--参数 值 或者 --参数=值。如:--dir=/root
optional_argument参数可选只能为:--参数=值
  • longindex:用来记录解析到的当前长选项的索引,也就是longopts的下标,通常设为NULL

返回值:

      对于短选项,返回值同getopt函数;对于长选项,如果flag是NULL,返回val,否则返回0;对于错误情况返回值同getopt函数

2、示例

#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>

static char *opt_storage = "ab:c::";
static const struct option storage_opts[] = {
	{ "a_long", no_argument, 0, 'a' },
	{ "b_long", required_argument, 0, 'b' },
	{ "c_long", optional_argument, 0, 'c' },
	{ 0, 0, 0, 0},
};

int main(int argc, char **argv)
{
	int opt = 0;
	int parm = 0;
	int object = 0;
	char *dir = NULL;

	while (1) {
		int opt_index = 0;
		opt = getopt_long(argc, argv, opt_storage, storage_opts, &opt_index);
		if (opt == -1)
			break;

		switch (opt) {
    		case 'a':
                printf("Input %d parameter is -a=%s\n", optind, optarg);
    			break;
    		case 'b':
    			printf("Input %d parameter is -b=%s\n", optind, optarg);
    			break;
    		case 'c':
    			printf("Input %d parameter is -c=%s\n", optind, optarg);
    			break;

    		default:
    			break;
		}
	}

	return 0;
}

运行结果:

$ ./aptget_long --a_long --b_long 123 --c_long=456
Input 2 parameter is -a=(null)
Input 4 parameter is -b=123
Input 5 parameter is -c=456

  • 24
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-26
`getopt` 是一个用于解析命令行参数的 C 函数,它可以帮助程序员在命令行中获取输入的参数。 `getopt` 会检查命令行参数中以单破折线(-)或双破折线(--)开头的选项。如果选项后面需要跟一个参数,则可以使用空格或等号来分隔选项和参数。例如,使用 `-o output.txt` 或 `--output=output.txt` 来指定输出文件名。 `getopt` 函数的使用需要包含头文件 `getopt.h`。常用的函数包括 `getopt` 和 `getopt_long`。`getopt` 用于解析简单的命令行选项,而 `getopt_long` 则支持更复杂的选项,例如长选项名(long options)和选项的描述信息。 下面是一个示例代码,演示了如何使用 `getopt` 函数解析命令行参数: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { int opt; char *output_file = NULL; while ((opt = getopt(argc, argv, "o:")) != -1) { switch (opt) { case 'o': output_file = optarg; break; default: fprintf(stderr, "Usage: %s [-o output_file]\n", argv[0]); exit(EXIT_FAILURE); } } printf("Output file: %s\n", output_file ? output_file : "stdout"); return 0; } ``` 在上面的代码中,我们使用 `getopt` 函数解析命令行参数。选项字符串 `"o:"` 表示程序支持一个 `-o` 选项,该选项需要一个参数。如果解析成功,`getopt` 函数返回该选项的字符表示(即 `'o'`),并将选项参数保存在全局变量 `optarg` 中。如果解析失败,`getopt` 函数返回 `-1`。 程序中还使用了标准的错误输出 `stderr` 和退出函数 `exit` 来处理错误情况。最后,程序输出解析结果,并退出。 注意,该示例代码仅用于演示 `getopt` 函数的基本用法,实际应用中可能需要更复杂的选项解析和错误处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值