実行ファイルに引数を取らせたい

実行ファイルに引数を取らせる事ができると何が便利か? それは、引数を次々に食わすシェルスクリプトを書いておけば 寝ている間にパラメータサーチができてしまうのです。 もしこれができないとすると、つきっきりでいちいちソースの中の パラメータを変えてコンパイルし直すか、 夜寝たければそうしてできた実行ファイルを計算したい パラメータの数だけ用意しておかないといけません。 というわけで、パラメータサーチ型の計算をする人にとっては なくてはならないテクニックなのです。

さて、能書きはこれくらいにして、実際どのように書けば 実行ファイル、つまり main 関数に引数を取らせる事ができるかを 示しましょう。以下はその例です。


#include < stdio.h > 
#include < stdlib.h > /* このライブラリは include しなくてはならない 
			 下で使う atoi, atof はこの中 */
 
int main(int argi, char **argv){ 
/* 変数名(argi,argv)は適当でOK。
argi には、引数が何個あるかが入る。
実行ファイルの名前(たとえば a.out) は1つと数えられるので注意。
argv はキャラクタ型のポインタへのポインタ。
(早い話が1文字を各要素に持つ行列のこと)
第0行が実行ファイルの名前で、第1行が第1引数、第2行が第1引数、、、となる。
prompt> a.out 100 3.8
の場合、argv 行列の具体的な形は、
	|a|.|o|u|t|
	|1|0|0|
	|3|.|8|
の様に入っている */

	int i;
	double x;
	
	if(argi == 3){ /* 必ずしも必要ではないが、入れておくと便利 */

	  i = atoi(argv[1]); /* 第1引数の 100 はあくまでも文字なので、
			        ここで int 型の数字に変える */
	  x = (double)atof(argv[2]); /* 第2引数の 3.8 もあくまでも文字なので、
			        ここで float 型の数字に変えて double にキャストする */

        }
	else{ /* 引数が二つ以外だったらここ */
	  printf("Usage: i  x\n");
	}
	return 0; /* 正常終了したら int 0 を返す */
}