getopt() && getopt_long()
c语言命令行,常用到getopt_long和getopt两个函数,在此做个记录
getopt()
getopt函数是一个用于解析命令行参数的C标准库函数,通常与头文件一起使用
int getopt(int argc, char * const argv[], const char *optstring)
这是getopt()函数的原型。它接受命令行参数的数量argc,以及参数数组argv[]和表示期望选项的字符串optstring。
optstring:参数是一个包含所有可能选项字符的字符串。如果一个选项后跟有冒号:,则表示该选项需要一个参数。例如,"i:o:v"表示选项i、o和v,其中i和o后面需要参数。
getopt()函数会在每次调用时返回下一个选项字符。如果选项需要参数,则参数值可以通过全局变量optarg获取。函数会根据命令行参数中的选项进行迭代,直到没有更多选项为止,此时返回-1。
函数使用demo:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { int opt; double num1 = 0.0; double num2 = 0.0; char operation = '\0'; while ((opt = getopt(argc, argv, "a:b:cdef")) != -1) { switch (opt) { case 'a': num1 = atof(optarg); break; case 'b': num2 = atof(optarg); break; case 'c': operation = 'c'; // 加法 break; case 'd': operation = 'd'; // 减法 break; case 'e': operation = 'e'; // 乘法 break; case 'f': operation = 'f'; // 除法 break; default: fprintf(stderr, "Usage: %s -a <number> -b <number> -c|-d|-e|-f\n", argv[0]); return 1; } } if (operation == '\0') { fprintf(stderr, "请选择要执行的操作\n"); return 1; } // 执行相应的操作 switch (operation) { case 'c': printf("%lf + %lf = %lf\n", num1, num2, num1 + num2); break; case 'd': printf("%lf - %lf = %lf\n", num1, num2, num1 - num2); break; case 'e': printf("%lf * %lf = %lf\n", num1, num2, num1 * num2); break; case 'f': if (num2 != 0) { printf("%lf / %lf = %lf\n", num1, num2, num1 / num2); } else { fprintf(stderr, "除数不能为零\n"); return 1; } break; } return 0; }
使用如下:
getopt_long()
当需要处理较长的命令行选项时,建议使用getopt_long()函数来解析命令行。getopt_long()函数与getopt()函数类似,但允许使用长选项名称
getopt_long()函数是一个用于解析命令行选项的函数,其定义如下:
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
getopt_long()函数的参数包括:
- argc:命令行参数个数;
- argv:命令行参数数组;
- optstring:指定短命令的字符串,每个字符代表一个选项;
- longopts:指向一个struct option类型的数组,其中每个元素表示一个长选项;
- longindex:一个指向整数的指针,表示当前处理的长选项的索引位置;
getopt_long()函数会依次解析命令行选项,并返回下一个选项字符。如果所有选项都已经解析完毕,则返回-1。
在使用getopt_long()函数时,可以通过设定长选项和短选项,来指定命令行参数的格式。其中,短选项使用单个字符表示,长选项使用字符串表示,通常以两个连字符(--)开头。
长选项需要定义为一个struct option类型的数组,其中每个元素表示一个长选项。
struct option结构体的定义如下:
struct option { const char *name; // 选项名称 int has_arg; // 是否需要参数 int *flag; // 如果非NULL,则返回值是一个flag,不再返回val int val; // 选项对应的字符值 };
在struct option结构体中,
name表示选项名称,has_arg表示是否需要参数(0表示不需要,1表示需要,2表示可选),flag和val用于指定选项对应的字符值。
如果需要解析长选项,可以在optstring参数中使用冒号(:)来标识。例如,如果需要解析一个名为--input的选项,并要求该选项有一个参数,则可以将optstring参数设置为"i:"。
函数使用demo:
#include <stdio.h> #include <stdlib.h> #include <getopt.h> int main(int argc, char *argv[]) { int opt; int option_index = 0; double num1 = 0.0; double num2 = 0.0; char operation = '\0'; static struct option long_options[] = { {"num1", required_argument, 0, 'a'}, {"num2", required_argument, 0, 'b'}, {"add", no_argument, 0, 'c'}, {"subtract", no_argument, 0, 'd'}, {"multiply", no_argument, 0, 'e'}, {"divide", no_argument, 0, 'f'}, {0, 0, 0, 0} }; while ((opt = getopt_long(argc, argv, "a:b:cdef", long_options, &option_index)) != -1) { switch (opt) { case 'a': num1 = atof(optarg); break; case 'b': num2 = atof(optarg); break; case 'c': operation = 'c'; // 加法 break; case 'd': operation = 'd'; // 减法 break; case 'e': operation = 'e'; // 乘法 break; case 'f': operation = 'f'; // 除法 break; default: fprintf(stderr, "Usage: %s --num1 <number> --num2 <number> --add|--subtract|--multiply|--divide\n", argv[0]); return 1; } } if (operation == '\0') { fprintf(stderr, "请选择要执行的操作\n"); return 1; } // 执行相应的操作 switch (operation) { case 'c': printf("%lf + %lf = %lf\n", num1, num2, num1 + num2); break; case 'd': printf("%lf - %lf = %lf\n", num1, num2, num1 - num2); break; case 'e': printf("%lf * %lf = %lf\n", num1, num2, num1 * num2); break; case 'f': if (num2 != 0) { printf("%lf / %lf = %lf\n", num1, num2, num1 / num2); } else { fprintf(stderr, "除数不能为零\n"); return 1; } break; } return 0; }
使用如下: