2 コマンドライン引数

メイン関数に引数としてデータを与えるコマンドライン引数について説明する.

2.1 使い方

メイン関数に引数を与えたい場合がある.例えば,ファイル名を指定して,そのファイル に書かれているデータの処理をしたい場合などである.プログラム中にファイル名を書く と,処理するデータが変わる毎にコンパイルの作業が必要となり,実用的なプログラムで はない.

メイン関数に引数としてデータを与えたい場合,コマンドライン引数を使う.その例のプ ログラムを,リスト1に示す.このプログラムは,実行ファイ ル名と引数をタイプして,実行させる.すると,メイン関数に引数という形でデータを渡 すことができる.この引数をコマンドライン引数と呼ぶ.

本当は,先に示したようにファイル名を引数にとって,その処理をするプログラムを例に すべきであるが,ソースが長くなる.そのため,ここでは,引数の値を表示するプログラ ムにとどめている.

   1 #include <stdio.h>
   2 
   3 int main(int argc, char *argv[])
   4 {
   5 
   6   int i;
   7 
   8   printf("argc = %d\n", argc);
   9 
  10   for(i=0; i<argc; i++){
  11     printf("argv[%d] = %s\n", i, argv[i]);
  12   }
  13 
  14   return 0;
  15 }


\fbox{\textgt{実行例}}
./cl hoge fugafuga


\fbox{\textgt{実行結果}}
argc = 3
argv[0] = ./cl
argv[1] = hoge
argv[2] = fugafuga

このプログラムを見て分かるとおり,main()関数の引数は,次のようになっている.

2.2 書き方

これは,ワンパターンで次のように書く.
	int main(int argc, char *argv[])

すると,実行時にmain()に引数として,コマンドと引数の総数がargcに,コマ ンドと引数の文字列の先頭アドレスが配列argv[]に格納される.先のリスト 1の通りである.

ここで,仮引数の変数名argcARGument CountargvARGument Vectorの略である.他の多くの言語でも,コマンドライン引数の変数名にはargcargvを使う.C言語の場合,慣例としてargcargvを使うが,他の変数名 でも問題はない.ただし,引数の型は変えてはならない.

ときどき,char *argv[]の代わりに,**argvと記述しているプログラム見る. これでも同じように動作する.なぜ,同じなの?--と言う疑問もあるだろう.説明すると, 結構長くなるし,退屈する者も出てくるだろう.興味のある者は,各自考えよ.

2.3 メモリーの内容

コマンドライン引数のchar *argv[]が分かりにくいであろう.これは,文字型のポ インターの配列という意味である.argv[]は配列になっており,そこには文字型の ポインター,すなわち文字列の先頭アドレスが格納される.先ほどの実行例では,図 1のようにメモリーに引数の値が格納される.

ようするに,文字列を表す場合,その先頭アドレスが必要と言うことである.

図 1: コマンドライン中のメモリーの様子.「./cl hoge fugafuga」と実行し た場合.
\includegraphics[keepaspectratio, scale=1.0]{figure/commandline_arg.eps}



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年11月14日


no counter