使用argp.h

时间:2017-01-30 22:16:11

标签: c arguments parameter-passing

我希望能够在我的C程序中接收程序参数和选项。选项应视为float s或int s。出于某种原因,我无法找到关于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。我知道直接解析为int和float不是argp的一部分,这就是为什么我(天真,似乎)试图将它添加到结构和parse_opt函数。

1 个答案:

答案 0 :(得分:0)

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

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