2013-11-26 199 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這樣的過程能夠將我的段錯誤地排列。

我也檢查通過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

相關問題