2017-01-30 6 views
-1

私のCプログラムでプログラムの引数とオプションを受け取ることができるようにしたいと思います。オプションはfloat秒またはint秒として処理する必要があります。何らかの理由で、argp.hについての良い記事、チュートリアル、ドキュメントが見つかりませんでした。私はGNU Libc Manualのexamplesで実装を開始しましたが、残念ながら解決には至りませんでした。予想通り、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のために得る出力IT:

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. 

を、私はNULL解析しようとして./a.out -b --int 2 myargのために私は、セグメンテーションフォールトを取得:key = i, arg = (null)を。 NULLチェックを追加しました。この方法では、私が解析したいオプションは,キー(iが付くと予想されます)が付属しています。

key = i, arg = (null) 
key = , arg = 2 

プログラムは、様々なfloatとint型のオプションを処理する必要があるので、私は戻ってデフォルト値に落下、ライブラリを使用して考えた、と私はあなた自身の引数とオプションのパーサをロールすることを推奨していないことが多い見てきました。例に基づいて、argp.hは有望に見えましたが、まだ動作させることができませんでした。

ps。私はintと浮動小数点への直接の解析はargpの一部ではないことを知っています。これが構造体に追加しようとしていたのです(parse_opt)。

+0

私は 'argtable'ライブラリをお勧めします。これはもっと良い選択でした。 –

答えて

0

明らかになったように、options[]のエラーがありました。オプションの引数が[source: GNU C: Argp Option Vectors]の場合は、argp_option構造体の3番目のconst char *argパラメータを指定する必要があります。

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} 
}; 
関連する問題