getopt_long 函数

getopt_long, getopt_long_only -- 命令行解析函数,支持长选项解析

【说明】getopt_long/getopt_long_only是getopt的泛集,getopt是getopt_long的一个子集,getopt支持的所有特性,getopt_long都支持,包括错误打印、argv元素顺序调整等;getopt_long相比getopt增加了长选项的解析,具体如下:

1、形如:cmd [--create][--file] //对长选项的解析;

2、形如:cmd [--create a_argument][-file b_argument] //对长选项及长选项的参数解析;

3、形如:cmd [--create [a_argument]] //选项create的参数也是可选的情况解析

getopt_long_only与getopt_long的区别在于:getopt_long仅仅只能将"--"开始的选项视为长选项,但getopt_long_only将"-"开头选项也会视为长选项,当长选项列表均不满足时,且短选项满足时,"-"才会解析为短选项;

原型:

#define _GNU_SOURCE

#include <getopt.h>

extern char *optarg;

extern int optind, opterr, optopt;

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

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

描述:

1、注意相比getopt,使用getopt_long需要加头文件<getopt.h>;

2、getopt_long除了会接受长选项,其他概念和getopt是一样的;

3、如果使用getopt_long想只接受短选项,设置longopts为NULL即可;如果只想接受长选项,相应地设置optstring为NULL即可;

4、长选项名是可以使用缩写方式,比如:选项有--file\--create,那么输入--c/--cr/--cre等均会被正确识别为create选项;

5、对于带参数的长选项格式是:--arg=param或--arg param;

6、longopts是指向struct option数组的第一个元素的指针,struct option定义在<getopt.h>中;

7、longindex如果非NULL,则是返回识别到struct option数组中元素的位置指针;

struct option的说明:

/*

name: 长选项名

has_arg: 是否带参数或可选参数,这个值在getopt.h中有宏定义,如下:

# define no_argument        0

# define required_argument  1

# define optional_argument  2

flag: 确定函数返回值的情况,如果flag==NULL,则识别选项后返回val(常用的如:设置val为长命令的短命令字符);否则,识别后getopt_long返回0,flag指向一个设置到val的变量;

val: 设置为返回值,或者是flag指向的变量;这里要注意不要写-1到val,否则其作用是getopt_long返回-1,然后停止解析选项;

[注意] longopts的最后一个元素必须是全0填充,否则会报段错误

*/

struct option {

const char *name;

int has_arg;

int *flag;

int val;

};

返回值:

1、如果识别短选项,同getopt一样返回短选项字符;

2、如果识别长选项,根据flag的设置返回不同的内容,一般flag都设置为NULL,返回val;

3、如果发生错误,如:未识别选项或者必须加参数的选项丢失参数,返回‘?‘,如果在optstring中设置了第一个字符为‘:‘,丢失参数返回‘:‘,这个同getopt返回时一样的;

4、当缩写长选项引起歧义时或者不需要的选项强加了参数,都会返回‘?‘;

5、返回-1表示选项处理全部结束;

6、如果在输入的argv[]中包含了独立的"--"字符串,同getopt一样,解析到这里返回-1,停止选项的解析;

测试实例:

#include <stdio.h>

#include <stdlib.h>

#include <getopt.h>

int main(int argc, char **argv)

{

        extern char *optarg;

        extern int optind, opterr, optopt;

        int c;

        int digit_optind = 0;

        while (1)

        {

                int this_option_optind= optind ? optind : 1;

                int option_index = 0;

                static struct option long_options[] =

                {

                        {"add", required_argument, NULL, 0},

                        {"append", no_argument, NULL, 0},

                        {"delete", required_argument, NULL, 0},

                        {"verbose", no_argument, NULL, 0},

                        {"create", required_argument, NULL, ‘c‘},

                        {"file", required_argument, NULL, 0},

                        {0, 0, 0, 0},

                };

                c = getopt_long(argc, argv, ":abc:d:012", long_options, &option_index);

                if (c == -1)

                        break;

                switch (c)

                {

                        case 0:

                                printf ("option %s", long_options[option_index].name);

                                if (optarg)

                                        printf (" with arg %s", optarg);

                                printf ("\n");

                                break;

                        case ‘0‘:

                        case ‘1‘:

                        case ‘2‘:

                                if (digit_optind != 0 && digit_optind != this_option_optind)

                                        printf ("digits occur in two different argv-elements.\n");

                                digit_optind = this_option_optind;

                                printf ("option %c\n", c);

                                break;

                        case ‘a‘:

                                printf ("option a\n");

                                break;

                        case ‘b‘:

                                printf ("option b\n");

                                break;

                        case ‘c‘:

                                printf ("option c with value \"%s\"\n", optarg);

                                break;

                        case ‘d‘:

                                printf ("option d with value \"%s\"\n", optarg);

                                break;

                        case ‘?‘:

                                break;

                        default:

                                printf ("?? getopt returned character code 0%o ??\n", c);

                }

        }

        if (optind < argc) {

                 printf ("non-option ARGV-elements: ");

                 while (optind < argc)

                          printf ("%s ", argv[optind++]);

                 printf ("\n");

         }

        exit(0);

}

运行自行操作测试

时间: 2024-10-18 05:32:16

getopt_long 函数的相关文章

命令行参数选项处理:getopt()及getopt_long()函数使用

在运行某个程序的时候,我们通常使用命令行参数来进行配置其行为.命令行选项和参数控制 UNIX 程序,告知它们如何动作.当 gcc的程序启动代码调用我们的入口函数 main(int argc,char *argv[]) 时,已经对命令行进行了处理.argc 参数包含程序参数的个数,而 argv 包含指向这些参数的指针数组. 程序的参数可以分为三种:选项,选项的关联值,非选项参数.例如: $gcc getopt_test.c -o testopt getopt_test.c是非选项参数,-o是选项,

命令行參数选项处理:getopt()及getopt_long()函数使用

在执行某个程序的时候,我们通常使用命令行參数来进行配置其行为.命令行选项和參数控制 UNIX 程序,告知它们怎样动作. 当 gcc的程序启动代码调用我们的入口函数 main(int argc,char *argv[]) 时,已经对命令行进行了处理.argc 參数包括程序參数的个数,而 argv 包括指向这些參数的指针数组. 程序的參数能够分为三种:选项.选项的关联值,非选项參数. 比如: $gcc getopt_test.c -o testopt getopt_test.c是非选项參数.-o是选

getopt_long函数解析命令行参数

转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用getopt来实现的. 在Linux下使用getopt写程序是一种比较cool的事情,下面来简单的介绍一下getopt的使用. === getopt使用 === 在讨论参数处理之前,我们先明确两个概念:选项.选项参数gcc -g -o test test.c我们经常使用上面的命令来编译程序,这里g和

命令行解析getopt_long

getopt_long函数可以轻松的解析main函数的命令行参数. int getopt_long(int argc,char * const argv[],const char *optstring,const struct option *longopts,int *longindex) 函数中的参数argc和argv通常直接从main()的两个参数传递而来.optstring是选项参数组成的字符串. 字符串optstring可以下列元素: 1. 单个字符,表示选项, 2. 单个字符后接一个

windows下的getopt/getoptlong函数

windows下的getopt/getoptlong函数 getopt/getopt_long函数是GNU C中的函数,在linux编程中很常用到.这里就不介绍了. windows下没有找到类似的函数,自己写一个又浪费时间,于是乎从glibc中找出来. 这里放出两个版本的下载地址 http://files.cnblogs.com/files/oloroso/getopt--from-glibc-2.15.tar.gz http://files.cnblogs.com/files/oloroso/

命令行选项解析函数(C语言):getopt()和getopt_long()

上午在看源码项目 webbench 时,刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了,说实话这函数没怎么见过,自然不知道这哥们是干什么的.于是乎百度了一番,原来是处理命令行选项参数的,的确,正规点的大型程序一般第一步就是处理命令行参数的,接着才是主干程序.在百度和 man 的帮助下,找到了具体使用方法和解释,二话不说赶紧学习一下,并总结出文档记录一下. 平时在写程序时常常需要对命令行参数进行处理,因为参数少,自己解析就可以搞定:如果命令行个数比较多时,如果按照顺序一个一个定

getopt函数

平时在写程序时常常需要对命令行参数进行处理,当命令行参数个数较多时,如果按照顺序一个一个定义参数含义很容易造成混乱,而且如果程序只按顺序处理参数的话,一些"可选参数"的功能将很难实现. 我们可以使用getopt.getopt_long.getopt_long_only来对这个问题进行处理. #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern

使用getopt函数对命令行短形参进行处理

今天,在看man 9 style时见到了用来处理命令行短形参getopt函数,很是诧异 -- 要知道,我处理命令行参数都是用手动的!于是我如获至宝,赶紧学习学习.getopt的原型被放在unistd.h中,它的原型是这样的:int getopt(int argc, char * const argv[], const char *optstring)这里的argc,argv就是main函数的形参,需要调用是只要把main形参给传过去就ok了.后面的optstring是一个集合,包括了所有可能的短

Linux cat 命令源码剖析

最近在读APUE, 边看还得边做才有效果. 正好linux下很多命令的是开源的, 可以直接看源码. GNU coreutils 是个不错的选择. 源码包有我们最常用的 ls, cat等命令的源码, 每个命令都比较短小精悍, 适合阅读. 下面是我阅读 cat 命令的一点笔记. 到这里下载源码. 在源码根目录下 ./configure; make 就可以直接编译, 修改后make就可以编译了. 命令源码在 src/目录中, lib/目录下有一些用到的辅助函数和常量定义. 1. 命令行解析 基本上所有