2017-01-30 13 views
-1

Я хотел был бы иметь возможность получить аргументы и варианты программы в моей программе 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.

+0

Я могу порекомендовать библиотеку 'argtable', это был бы лучший выбор. –

ответ

0

Как оказалось, произошла ошибка с options[]. Третий параметр const char *arg в структуре argp_option должен быть предоставлен, если параметр имеет аргумент, связанный с ним [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} 
};