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

标签 c command-line-arguments gnu

我正在尝试使用 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);
}

当我运行程序时出现段错误。请考虑该文档不是很好,我不太了解。例如,我不知道如何处理强制性论点。但是,我从没想过像 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}
};

关于c - 使用 argp 解析 C 参数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229917/

相关文章:

c - glibc什么时候会发生文件流锁定?

c - 如何通过makefile包含头文件

c - C 语言的套接字编程 - Web 服务器

c - GList 行为错误 - 下一个大小无效(正常)

使用可变数量的参数调用 exec?

c - GNU mingw 编译器错误 : sh: gcc: command not found

c - 打印 64 位素数和

ruby - 如何将参数传递给 msfconsole -r resource.rc <arg1> <arg2>

sql - 如何使用参数从 bash 脚本运行 SQL 更新字符串?

python - 从源代码安装Python 3.1.2,如何解决sqlite3-dev依赖关系?