【问题标题】:Parse to integer with argp.h使用 argp.h 解析为整数
【发布时间】:2017-06-16 05:28:20
【问题描述】:

我希望能够在我的 C 程序中接收程序参数和选项。选项应视为floats 或ints。出于某种原因,我找不到关于argp.h 的好文章、教程和文档。我从 GNU Libc 手册中的 examples 开始实施,但不幸的是,它没有让我找到解决方案。

这是我尝试解决问题的方法(可以编译示例,包括所有必要的行):

#include <stdlib.h>
#include <argp.h>

static char doc[] = "Doc";
static char args_doc[] = "ARG1";

static struct argp_option options[] = {
  {"bool", 'b', 0, 0, "Simple boolean flag, works as I expected."},
  {"int", 'i', 0, 0, "Would like to be able to parse options as --int=4 or -i 4."},  // but I can't
  {0}
};

struct arguments {char *args[1]; int xbool, xint;};

static error_t
parse_opt (int key, char *arg, struct argp_state *state) {
    struct arguments *arguments = state->input;
    printf("key = %c, arg = %s\n", key, arg);  // My attempt to understand the problem
    //if (arg == NULL) return 0;  // Prevents segfaults, in order to see how the args and keys change
    switch (key) {
        case 'b': arguments->xbool = 1; break;
        case 'i': arguments->xint = (int) strtol(arg, NULL, 10); break;
        case ARGP_KEY_ARG: if (state->arg_num >= 1) {argp_usage(state);} arguments->args[state->arg_num] = arg; break;
        case ARGP_KEY_END: if (state->arg_num < 1) {argp_usage(state);} break;
        default: return ARGP_ERR_UNKNOWN;
        }
    return 0;
}

static struct argp argp = { options, parse_opt, args_doc, doc };

int main (int argc, char **argv) {
    struct arguments arguments;
    arguments.xbool = 0;
    arguments.xint = 0;
    argp_parse (&argp, argc, argv, 0, 0, &arguments);
    printf("ARG1 = %s\nbool option = %s\nparsed int option = %d",
           arguments.args[0], arguments.xbool ? "true" : "false", arguments.xint);
    exit (0);
}

简单的布尔标志按预期工作,所以./myprogram.out myarg --bool./myprogram.out myarg -b 改变了标志的值。

但是,我似乎找不到将参数解析为整数或浮点数的方法。

这是我为./a.out -b --int=2 myarg 得到的输出:

key = , arg = (null)
key = b, arg = (null)
./a.out: option '--int' doesn't allow an argument
Try `a.out --help' or `a.out --usage' for more information.

对于./a.out -b --int 2 myarg,我遇到分段错误,因为我尝试解析 NULL:key = i, arg = (null)。我添加了一个NULL 检查,这样我可以看到,我想解析的选项带有一个, 键(预计带有i)。

key = i, arg = (null)
key = , arg = 2

我考虑过使用库,因为程序需要处理各种 float 和 int 选项,回退到默认值,而且我经常看到不建议滚动您自己的参数和选项解析器。根据示例,argp.h 看起来很有希望,但是我还不能让它工作。

ps。我知道直接解析为整数和浮点数不是argp 的一部分,这就是为什么我(似乎天真地)试图将它添加到结构和parse_opt 函数中。

【问题讨论】:

  • 我可以推荐 argtable 库,它会是一个更好的选择。
  • 这个问题怎么会被否决?它肯定显示了研究工作,对使用 argp 的人很有用,并且所述问题很清楚。奖励:它向我展示了一个工作示例。投票赞成。
  • 很高兴听到@StéphaneGourichon!
  • 关于argtable的选择,我看了一点。有趣的。一些示例很好地利用了“variable=value”是一个有效的 C 表达式返回值这一事实,以消除代码中的重复。它有时只比 argp 少一点(在自动帮助大小上),有时更多(可以一次报告几个错误,标准化可选 args,集成解析常见值)。不过,不确定如何解析自定义值。感谢@VinceVarge 提到这两个!

标签: c arguments parameter-passing


【解决方案1】:

事实证明,options[] 存在错误。第三个,argp_option 结构中的const char *arg 参数必须提供,如果该选项有与之关联的参数[source: GNU C: Argp Option Vectors]

static struct argp_option options[] = {
  {"bool", 'b', 0, 0, "Simple boolean flag, works as I expected."},
  {"int", 'i', "Numbah", 0, "Now everything works as expected, I get the correct key-value (key-arg) pair in the parse_opt function"},
  {0}
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多