一、基本概念
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 是处理命令行参数的两个重要工具,尤其对于有多个选项的命令来说,使用这两个函数能够有效地提高程序解析命令行的效率,并且使代码更具可读性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/283068.html
微信扫一扫
支付宝扫一扫