私の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
)。
私は 'argtable'ライブラリをお勧めします。これはもっと良い選択でした。 –