一、基本概念
getopt是一种命令行参数解析器, 它基于Unix中的POSIX标准。该命令用来解析命令行中的选项参数,当参数比较多时,可以用该命令来方便的处理。
getopt和getopt_long 处理命令行参数相对于手写处理具有很多优劣之处。其中最显著的是它可以自动处理 POSIX 规范中指定的单字母选项和长选项,而且它会自动处理重复的选项。
getopt的最基本用法如下:
int getopt(int argc, char * const argv[], const char *optstring);
该函数在解析命令行参数时,会返回一个选项字符,用来标识当前参数是哪一个。同时,由于存在必选参数和可选参数,程序员需要自行解析optopt等全局变量来处理不同的情况。optstring参数用来指定哪些选项是可选的,哪些选项要求必须指定参数等等(“单字母选项”)。
二、用法示例
1、无参数选项
使用getopt可以很好地处理无参数选项。在命令行中,只需要输入选项的名称(比如 “-h” 或“--help”)就可以使用该选项。例如:
int main(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "h")) != -1) { switch (opt) { case 'h': printf("Help information\n"); break; default: break; } } return 0; }
上述代码定义了一个“帮助”选项。用户输入 -h 或 --help 时,会在命令行中输出帮助信息。
2、有参数选项
当选项需要带有参数时,可以使用getopt函数中的全局变量optarg。例如:
int main(int argc, char *argv[]) { int opt; char *file_path; while ((opt = getopt(argc, argv, "f:")) != -1) { switch (opt) { case 'f': file_path = optarg; // do something with file_path break; default: break; } } return 0; }
上述代码定义了一个“文件”选项。用户输入 -f file_path 时,会自动解析出 file_path,并把它存入全局变量 optarg 中。用户可以在 switch-case 代码块中使用 optarg 对 file_path 进行操作。
3、混合使用选项
使用 getopt 处理混合式选项时,需要注意选项的顺序。getopt函数会循环读取命令行参数,例如输入命令:
./test -h -v -f file_path
代码中 -h 和 -v 都是无参数选项,但 -f 是带参数的选项。
int main(int argc, char *argv[]) { int opt; char *file_path; while ((opt = getopt(argc, argv, "hv:f:")) != -1) { switch (opt) { case 'h': printf("Help information\n"); break; case 'v': printf("Verbose information\n"); break; case 'f': file_path = optarg; // do something with file_path break; default: break; } } return 0; }
上述代码演示了如何处理混合式选项。在代码中,选项的顺序不是固定的,getopt函数可以循环读取到正确的选项字符。
三、getopt_long的使用
对于含有大量选项的命令,getopt_long 函数则显得更加合适,因为它支持长选项(带有 -- 前缀的选项)和附加的帮助文本(help text)。
getopt_long 的使用方法与 getopt 差不多,这里就不赘述了。它的函数定义如下:
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
注意: 英文逗号。记住:--help 这种长格式选项前是两个减号,而普通选项前是一个减号,且短格式选项可以组合,如 -hv。
下面是 getopt_long 函数的示例代码:
#include#include int main(int argc, char *argv[]) { int opt = 0; struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, {"file", required_argument, 0, 'f'}, {0, 0, 0, 0} }; int option_index = 0; char * file_path; while ((opt = getopt_long(argc, argv, "hvf:", long_options, &option_index)) != -1) { switch(opt) { case 'h': printf("Help information\n"); break; case 'v': printf("Verbose information\n"); break; case 'f': file_path = optarg; // do something with file_path break; default: break; } } return 0; }
四、总结
getopt 和 getopt_long 是处理命令行参数的两个重要工具,尤其对于有多个选项的命令来说,使用这两个函数能够有效地提高程序解析命令行的效率,并且使代码更具可读性。