2013-11-26 1 views
0

Я пытаюсь использовать 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

ответ

2

Argp не знает, сколько опций у вас в вашем массиве. Для этого требуется, чтобы последний элемент массива опций был равен всем нулям:

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"}, 
    {0} 
}; 
+0

В настоящий момент у меня нет моего компьютера. Позже я попробую, но имеет смысл ... Теперь я понимаю, почему в учебнике я нашел эту строку со всеми нулевыми элементами. – Andry

Смежные вопросы