我希望能够在我的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
函数。
答案 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}
};