【发布时间】: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