Я пытаюсь использовать GNU argp
, чтобы проанализировать аргументы в моем приложении C. Мое приложение принимает необязательные аргументы и необязательный аргумент. Использование выглядит следующим образом:Ошибка сегментации при использовании argp для анализа аргументов C
<prog-name> <file> [-i <input file>] [-o <output-file>]
Моя программа выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <argp.h>
typedef struct {
char* args[2];
int silent,verbose;
char* input_file;
char* output_file;
} args_t;
int main(int argc, char** argv);
static error_t parse_opt(int key, char*arg, struct argp_state* state);
error_t parse_opt(int key, char*arg, struct argp_state* state) {
args_t* args = state->input;
switch (key) {
case 'o':
args->output_file = arg;
break;
case 'i':
args->input_file = arg;
break;
case ARGP_KEY_ARG:
if (state->arg_num >= 2) /* Too many arguments. */
argp_usage(state);
args->input_file = arg;
break;
case ARGP_KEY_END:
if (state->arg_num < 2)/* Not enough arguments. */
argp_usage(state);
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
int main (int argc, char** argv) {
// Resources needed for parameter handling
char* doc = "";
char* args_doc = "ARG1 ARG2";
struct argp_option opts[] = {
{"output", 'o', "out", OPTION_ARG_OPTIONAL, "The output file to produce"},
{"input", 'i', "in", OPTION_ARG_OPTIONAL, "The input file to use"},
};
struct argp argp = {opts, parse_opt, args_doc, doc};
args_t args;
args.silent = 0;
args.verbose = 0;
args.input_file = "";
args.output_file = "";
argp_parse(&argp,argc,argv,0,0,&args);
}
Когда я запускаю программу, я получаю ошибку сегментации. Пожалуйста, подумайте, что документ не очень хорош, и я не мог понять многое. Например, я не знаю, как обращаться с обязательным аргументом. Но я никогда не ожидал такой процедуры, как argp_parse
, чтобы segfault me, когда аргументы не переданы правильно.
Я также проверил через gdb
, где ошибка приложения, а не parse_opt
, она находится где-то внутри до argp_parse
. Что я делаю не так? Thankyou
В настоящий момент у меня нет моего компьютера. Позже я попробую, но имеет смысл ... Теперь я понимаю, почему в учебнике я нашел эту строку со всеми нулевыми элементами. – Andry