Я хотел был бы иметь возможность получить аргументы и варианты программы в моей программе C. Варианты следует рассматривать как float
s или int
s. По какой-то причине я не смог найти хорошие статьи, учебники, документы о argp.h
. Я начал свою реализацию с examples в руководстве GNU Libc, но, к сожалению, это не привело меня к решению.Разбор для целого числа с argp.h
Вот как я пытался решить эту проблему (например, может быть собран, включены все необходимые строки):
#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
Я думал об использовании библиотеки, потому что программа должна обрабатывать различные поплавка и ИНТ варианты, попадающие обратно к значениям по умолчанию, и я видел часто, что это не рекомендуется, чтобы свернуть свой собственный аргумент и варианты синтаксического анализа. Основываясь на примерах, argp.h
выглядел многообещающим, однако я не мог заставить его работать.
пс. Я знаю, что синтаксический анализ непосредственно с ints и floats не является частью argp
, поэтому я (наивно, похоже) пытался добавить его в структуры и функцию parse_opt
.
Я могу порекомендовать библиотеку 'argtable', это был бы лучший выбор. –