2013-11-26 165 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

相关问题