コマンドラインのオプション解析について その2

C言語の基本確認問題:中級

argv[]の中身を解析することで、いろいろな挙動を実現できます。 例えば、「"-"の後ろに何かアルファベット一文字("-o" や "-l")があるときに そのプログラムの挙動を変える」や、「そのアルファベット一文字の後ろの 文字列や数字("-P100")によって、反復回数などの数値を実行時に 与えることができます。簡単な例でのオプション解析プログラムを以下に記載します。

ただし、以下のコード中に、 2バイトスペースやhtmlファイル特有のコード ("<", ">"はhtmlファイルでは特殊なコードになります)が含まれるので、自分でコピー&ペースト の際には変換するか自分で打ち込んでください。

#include < stdio.h > #include < stdlib.h > #include < string.h > struct option { // option 解析後のデータを格納する構造体 char file[100]; int num, fg; double param; }; void parse_int(int argc, char **argv, struct option *opt) { char *p, *in_p; while(--argc > 0){ if(**(++argv) == '-'){ p = *argv; ++p; in_p = p; switch(*p){ case 'f':  // 文字列の受け取り strcpy(opt->file, ++in_p); printf("Save data to file[%s]\n", opt->file); break; case 'i':  // int型変数の受け取り opt->num = atoi(++in_p); printf("Iteration num is %d\n ", opt->num); break; case 'P':  // double型変数の受け取り opt->param = atof(++in_p); printf("Parameter is %f\n", opt->param); break; case 'l': // 数値、文字列は受け取らないが、何がしかの挙動を変えたいとき printf("Program is executed once\n"); /* ここで適当な実行文を書く */ opt->fg = 1; break; fprintf(stderr," Options are incorrect \n"); exit(-1); } }else{ fprintf(stderr," Arguments is incorrect \n"); exit(-1); } } } int main( argc,argv ) int argc ; char *argv[] ; { parse_int(argc, argv, opt); }

をコンパイルした実行ファイル a.out を

% ./a.out -P10.3 -ffile01 -i30 -l

として実行すれば、実行結果は、

Parameter is 10.300000 Save data to file[file01] Iteration num is 30 Program is executed once

となります。 この方法を使えば、コマンドライン内で与える変数のはじめの一文字の アルファベットさえ守れば、 どのような順番で変数を与えることができます。また、上記プログラムでの 構造体optの各メンバーに初期値を与えておき、オプションで指定されたと きにのみ、指示された値になるようにすることもできます。

ただし、このようなプログラムは、「どのような状況で実行されたか?」が クリアでなくなりますので、プログラム実行状況を必ず結果ファイル等に記 載するようにしてください。