使用argp解析C参数时出现分段错误

使用argp解析C参数时出现分段错误,c,command-line-arguments,gnu,C,Command Line Arguments,Gnu,我试图使用GNUargp来解析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 sile

我试图使用GNU
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);
}
[-i][-o]
我的程序如下所示:

<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);
}
#包括
#包括
#包括
类型定义结构{
char*args[2];
int沉默,冗长;
字符*输入文件;
char*输出文件;
}args_t;
int main(int argc,字符**argv);
静态错误\u t parse\u opt(int key,char*arg,struct argp\u state*state);
错误解析选项(int键、char*arg、struct argp\u state*state){
args_t*args=状态->输入;
开关(钥匙){
案例“o”:
args->output_file=arg;
打破
案例“i”:
args->input_file=arg;
打破
案例ARGP_KEY_ARG:
如果(state->arg_num>=2)/*参数太多*/
argp_使用情况(状态);
args->input_file=arg;
打破
案例ARGP_KEY_END:
如果(state->arg_num<2)/*参数不足*/
argp_使用情况(状态);
打破
违约:
返回ARGP_ERR_UNKNOWN;
}
返回0;
}
int main(int argc,字符**argv){
//参数处理所需的资源
char*doc=“”;
char*args\u doc=“ARG1 ARG2”;
结构argp_选项选择[]={
{“output”,“o”,“out”,OPTION_ARG_OPTIONAL,“要生成的输出文件”},
{“input”,“i”,“in”,OPTION_ARG_OPTIONAL,“要使用的输入文件”},
};
结构argp argp={opts,parse_opt,args_doc,doc};
args_t args;
args.silent=0;
args.verbose=0;
args.input_file=“”;
args.output_file=“”;
argp_解析(&argp,argc,argv,0,0,&args);
}
当我运行程序时,我得到了分段错误。请考虑DOC不是很好,我不能理解太多。例如,我不知道如何处理强制论点。但是,当参数没有以正确的方式传递时,我从来没有想到像
argp_parse
这样的过程会对我进行分段


我还通过
gdb
检查了应用程序出现故障的地方,它不是
parse_opt
,而是
argp_parse
的内部某处。我做错了什么?谢谢

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}
};

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}
};

目前我这里没有电脑。稍后我会尝试,但有意义。。。现在我明白了为什么,在教程中,我发现这条线都是零元素。现在我没有我的电脑在这里。稍后我会尝试,但有意义。。。现在我明白了为什么在教程中,我发现这条线包含所有零元素。