珠海 旅游 网站建设,建设部资质网站,wordpress 一些源代码,免费域名freenom平时在写程序时常常需要对命令行参数进行处理#xff0c;当命令行参数个数较多时#xff0c;如果按照顺序一个一个定义参数含义很容易造成混乱#xff0c;而且如果程序只按顺序处理参数的话#xff0c;一些“可选参数”的功能将很难实现。
在Linux中#xff0c;我们可以使…平时在写程序时常常需要对命令行参数进行处理当命令行参数个数较多时如果按照顺序一个一个定义参数含义很容易造成混乱而且如果程序只按顺序处理参数的话一些“可选参数”的功能将很难实现。
在Linux中我们可以使用getopt、getopt_long、getopt_long_only来对这个问题进行处理。#include unistd.h int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; #include getopt.h 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);从最简单的getopt讲起getopt函数的前两个参数就是main函数的argc和argv这两者直接传入即可要考虑的就只剩下第三个参数。
optstring的格式举例说明比较方便例如char *optstring abcd:;
上面这个optstring在传入之后getopt函数将依次检查命令行是否指定了 -a -b -c及 -d这需要多次调用getopt函数直到其返回-1当检查到上面某一个参数被指定时函数会返回被指定的参数名称即该字母
最后一个参数d后面带有冒号: 表示参数d是可以指定值的如 -d 100 或 -d user。
optind表示的是下一个将被处理到的参数在argv中的下标值。
如果指定opterr 0的话在getopt、getopt_long、getopt_long_only遇到错误将不会输出错误信息到标准输出流。#include unistd.h#include stdlib.h#include stdio.h int main(int argc, char *argv[]){ int opt; char *optstring a:b:c:d; while ((opt getopt(argc, argv, optstring)) ! -1){ printf(opt %c\n, opt); printf(optarg %s\n, optarg); printf(optind %d\n, optind); printf(argv[optind - 1] %s\n\n, argv[optind - 1]);} return 0;}
编译上述程序并运行有如下结果 casheyubuntu:~/Desktop/getopt$ ./test_getopt -a 100 -b 200 -c admin -dopt aoptarg 100optind 3argv[optind - 1] 100 opt boptarg 200optind 5argv[optind - 1] 200 opt coptarg adminoptind 7argv[optind - 1] admin opt doptarg (null)optind 8argv[optind - 1] -d下面来讲getopt_long函数getopt_long函数包含了getopt函数的功能并且还可以指定“长参数”或者说长选项与getopt函数对比getopt_long比其多了两个参数int getopt(int argc, char * const argv[], const char *optstring);int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
在这里longopts指向的是一个由option结构体组成的数组那个数组的每个元素指明了一个“长参数”即形如--name的参数名称和性质struct option { const char *name; int has_arg; int *flag; int val; }; name 是参数的名称 has_arg 指明是否带参数值其数值可选 no_argument (即 0) 表明这个长参数不带参数即不带数值如--name required_argument (即 1) 表明这个长参数必须带参数即必须带数值如--name Bob optional_argument即2表明这个长参数后面带的参数是可选的即--name和--name Bob均可 flag 当这个指针为空的时候函数直接将val的数值从getopt_long的返回值返回出去当它非空时val的值会被赋到flag指向的整型数中而函数返回值为0 val 用于指定函数找到该选项时的返回值或者当flag非空时指定flag指向的数据的值。
另一个参数longindex如果longindex非空它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述即是longopts的下标值。#include unistd.h#include stdlib.h#include stdio.h#include getopt.h intmain(int argc, char **argv){ int opt; int digit_optind 0; int option_index 0; char *optstring a:b:c:d; static struct option long_options[] {{reqarg, required_argument, NULL, r},{noarg, no_argument, NULL, n},{optarg, optional_argument, NULL, o},{0, 0, 0, 0}}; while ( (opt getopt_long(argc, argv, optstring, long_options, option_index)) ! -1){ printf(opt %c\n, opt); printf(optarg %s\n, optarg); printf(optind %d\n, optind); printf(argv[optind - 1] %s\n, argv[optind - 1]); printf(option_index %d\n, option_index);} return 0;}编译运行以上程序并运行可以得到以下结果casheyubuntu:~/Desktop/getopt$ ./test_getopt_long -a 100 --reqarg 100 --nonargopt aoptarg 100optind 3argv[optind - 1] 100option_index 0opt roptarg 100optind 5argv[optind - 1] 100option_index 0./test_getopt_long: unrecognized option --nonargopt ?optarg (null)optind 6argv[optind - 1] --nonargoption_index 0当所给的参数存在问题时opt即函数返回值是?如 casheyubuntu:~/Desktop/getopt$ ./test_getopt_long -a./test_getopt_long: option requires an argument -- aopt ?optarg (null)optind 2argv[optind - 1] -aoption_index 0casheyubuntu:~/Desktop/getopt$ ./test_getopt_long --reqarg./test_getopt_long: option --reqarg requires an argumentopt ?optarg (null)optind 2argv[optind - 1] --reqarg最后说说getopt_long_only函数它与getopt_long函数使用相同的参数表在功能上基本一致只是getopt_long只将--name当作长参数但getopt_long_only会将--name和-name两种选项都当作长参数来匹配。在getopt_long在遇到-name时会拆解成-n -a -m -e到optstring中进行匹配而getopt_long_only只在-name不能在longopts中匹配时才将其拆解成-n -a -m -e这样的参数到optstring中进行匹配。