我在新程序中使用getopt_long
函数。
传递有效的长选项时,它运行良好。但是,如果我尝试使用无效选项(即--unknown
)来调用程序,则会暂停执行,原因是发生了分段错误。完整命令为program version --unknown
。
我需要在哪里更改代码以使程序再次运行? (注意:传递无效的 short 选项很好)
这是用于命令行程序的。它需要接收子命令作为其第一个参数,以及每个子命令特有的选项。我想增加对长选项的支持,因为使用短选项确实很困难。
char* subcommand = /* ... */;
int option_char = 0;
int exit_code = 0;
/* ... */
// Note: argv should be an array of strings containing the command-line arguments
int pm_parse_arguments(int argc, char** argv) {
opterr = 0;
if(strcmp(subcommand, "version") == 0) {
return pm_parse_version_arguments(argc, argv);
} else {
// No recognized subcommand
pm_global_unrecognized_subcommand(subcommand);
}
return exit_code;
}
int pm_parse_version_arguments(int argc, char** argv) {
// List of long options
struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"major", no_argument, 0, 'm'},
{"minor", no_argument, 0, 0},
{"revision", no_argument, 0, 'r'},
};
// Index of option
int option_index = 0;
while((option_char = getopt_long(argc, argv, ":hmr", long_options, &option_index)) != -1) {
switch(option_char) {
/* ... */
}
return exit_code;
}
在传递长选项Unrecognized option: --unknown
时,它应该打印--unknown
,就像短选项一样。而是返回细分错误。
这里是full output log of Valgrind的详细模式。
答案 0 :(得分:1)
getopt_long
要求长选项数组以零选项结构终止(类似于字符串以空值终止)。否则,它将不知道有多少。