疑问?
在linux使用中会发现很多命令行程序都要参数如
ls -a、ls -a /
,参数解析是怎么实现的?
解惑
main参数中有int argc,char ** argv,如果是新手可能会使用for 配合char一个一个解析,这样如果参数过多则会使用大量的if进行判断,实在是太辛苦!有什么更好的方法吗?
getopt_long 函数 他的定义如下:extern int getopt_long (int ___argc, char *const *___argv,const char *__shortopts, const struct option *__longopts, int *__longind);
argc
main方法传入的参数个数
argvmain方法传入的具体参数
shortopts设置参数如 -a --a 此处传入a,传入abc解析参数为--a --b --c,根据上一个例子可以看到是--而不是常有的-,如果想改成-需要在标识符后面加上:,代表着此标识符后面的数据一定是此标识符的设定。后续has_arg也会影响此处的设定。
longopts设置参数匹配列表
longind匹配到列表中的下标
struct option { const char *name; int has_arg; int *flag; int val; };
name
长名字 如 -a 代表 all的缩写此处填入all
has_arg三个选值0:no_argument 后面不跟值此处只做设定 如 ls -a 打印所有数据,1:required_argument 后面必有值如果是此选项shortopts如果是a:则可以使用 -a 进行设置,2:optional_argument 可选参数如果此处shortopts是a:则与required_argument 效果一样否则需要使用--a=vv 进行传值
val此方法默认返回值,一般采用shortopt传入 这样 匹配到a则返回值就是a 方便做a的处理
flag一般设置为null 则代表 返回值是匹配的val,如果非null则会将匹配的val赋值给传入flag的地址中,需要注意的是返回值为0
这里需要提到一个变量optarg
,此变量在getopt.h中声明了用于存放解析的结果数据,getopt_long需要配合while进行解析 每次循环匹配到列表中的数据则会根据longind设置当前匹配项所对应的列表下标,将获取到配置值传入optarg中,从而继续操作。
到这里就可以尽情的发挥你的操作想象了。
这里进行补充,可能又好奇的小伙伴回想他怎么知道写一个参数改获取谁毕竟我们并没有传入当前是哪个参数的标识符,因为它内部有个optind用来记录所以不要再外部操作此变量。
网友评论