getopt函数/getopt_long函数
目录getopt
getopt
函数是 Unix 和 Linux 系统编程中用于解析命令行选项的常用工具。它属于 GNU C 库的一部分,因此在大多数 Linux 发行版中都是可用的。下面是一个简单的 getopt
函数的使用示例:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int opt;
int aflag = 0;
int bflag = 0;
char *cvalue = NULL;
while ((opt = getopt(argc, argv, "abc:")) != -1) {
switch (opt) {
case 'a':
aflag = 1;
break;
case 'b':
bflag = 1;
break;
case 'c':
cvalue = optarg;
break;
case '?':
if (optopt == 'c')
fprintf(stderr, "Option -%c requires an argument.\n", optopt);
else if (isprint(optopt))
fprintf(stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt);
return 1;
default:
abort();
}
}
/* 检查是否还有额外的非选项参数 */
if (optind < argc) {
printf("non-option ARGV-elements: ");
while (optind < argc)
printf("%s ", argv[optind++]);
printf("\n");
}
printf("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue);
return 0;
}
这个示例程序使用 getopt
函数解析命令行选项 -a
,-b
和 -c
,其中 -c
选项需要一个参数。程序首先通过 getopt
循环解析所有的命令行选项,然后根据解析结果设置相应的标志或变量。如果解析过程中遇到未知的选项或 -c
选项缺少参数,程序会打印错误信息并退出。最后,程序打印出解析得到的选项值,并检查是否有额外的非选项参数。
你可以像这样编译和运行这个程序:
gcc -o getopt_example getopt_example.c
./getopt_example -a -b -c value1 arg1 arg2
这将输出:
aflag = 1, bflag = 1, cvalue = value1
non-option ARGV-elements: arg1 arg2
getopt_long
getopt_long
函数是 getopt
函数的扩展,它允许你使用长选项(例如 --option
而不是 -o
),并且支持选项的参数。下面是一个使用 getopt_long
的简单示例:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
static struct option long_options[] = {
{"verbose", no_argument, 0, 'v'},
{"create", required_argument, 0, 'c'},
{"file", required_argument, 0, 'f'},
{"help", no_argument, 0, 'h'},
{0, 0, 0, 0}
};
int main(int argc, char *argv[]) {
int option_index = 0;
int c;
char *create_arg = NULL;
char *file_arg = NULL;
int verbose_flag = 0;
while ((c = getopt_long(argc, argv, "vc:f:h", long_options, &option_index)) != -1) {
switch (c) {
case 'v':
verbose_flag = 1;
break;
case 'c':
create_arg = optarg;
break;
case 'f':
file_arg = optarg;
break;
case 'h':
printf("Usage: %s [-v] [-c arg] [-f arg] [-h]\n", argv[0]);
exit(EXIT_SUCCESS);
default:
/* '?' 被 getopt_long 打印 */
exit(EXIT_FAILURE);
}
}
/* 检查是否还有额外的非选项参数 */
if (optind < argc) {
printf("Non-option arguments: ");
while (optind < argc)
printf("%s ", argv[optind++]);
printf("\n");
}
printf("Verbose flag is %s\n", verbose_flag ? "on" : "off");
if (create_arg)
printf("Create argument is '%s'\n", create_arg);
if (file_arg)
printf("File argument is '%s'\n", file_arg);
return 0;
}
在这个示例中,我们定义了一个 long_options
结构体数组,它包含了所有支持的长选项和对应的短选项。getopt_long
函数会根据这个数组解析命令行参数。
你可以这样编译和运行这个程序:
gcc -o getopt_long_example getopt_long_example.c
./getopt_long_example --create newfile --file input.txt -v
这将会输出:
Verbose flag is on
Create argument is 'newfile'
File argument is 'input.txt'
注意,getopt_long
函数在解析到未知选项时会打印一个错误消息,并且会设置 optopt
变量为未知选项的第一个字符。如果你想自定义错误消息或处理逻辑,可以在 switch
语句中添加一个 case '?':
分支。
此外,如果 getopt_long
检测到需要参数的选项没有跟随相应的参数,它也会打印一个错误消息,并将 optarg
设置为 NULL。在上面的示例中,我们通过检查 optarg
是否为 NULL 来确保所有需要参数的选项都已经正确提供了参数。