next up previous contents
Next: 1. 課題 24 Up: C 言語 Previous: 3. プリプロセッサ cpp

25. main 関数の引数

これまで関数の引数については学んだが、main()関数については 常に引数はなかった。しかし、通常 Unix などで用いるコマンドの多くは C言語で書かれており、それらにはオプションと呼ばれるものを指定する 事が可能である。例えば、ファイルをコピーするのに用いられる cp コマンド は通常二つのコマンドライン引数を与え、


    > cp  test1  test2

のように使う。これによって、test1 のファイルの中身が test2 に コピーされる。つまり、C言語ではこうしたコマンドラインオプション を扱う事が出来る訳である。

コマンドラインに与えられた文字列は、空白を区切りとして複数の 文字列に分けられ、それぞれの文字列へのポインタが main()関数 に与えられるようになっている。当然、それらの文字列がいくつあるか が分からないと困るので、main()関数に与えられる引数は2つの 要素からなる。一つは、コマンドラインオプションの数と、それぞれの コマンドラインオプションの文字列へのポインタである。

上の例の場合、コマンドラインオプションの数は 3 個である。それぞれの コマンドラインオプションは、"cp", "test1", "test2" という文字列になる。(コマンド自体がオプションに入っているのは、 それなりに便利な事があり、自分自身の名前を知る簡単な方法にもなって いる)

これらを扱うには、以下のように行う。


   main( int argc, char *argv[] ){
      ...

ここで、argc にコマンドラインオプションの数(コマンド自体を 含む)、argv[] にそれぞれの文字列へのポインタが入っている。

これを使う場合には通常以下のように行う。


   main( int argc, char *argv[] ){
       char *p;
       int i;
       for(i=0; i<argc; i++){
           p=argv[i];
           printf("argv[%d]= %s\n",i,p);
       }
   }

つまり、このプログラムに対して、


    > a.out  test1   test2   test3
    argv[0]= a.out
    argv[1]= test1
    argv[2]= test2
    argv[3]= test3

となる訳である。注意すべきは、コマンドラインの引数の数を越えてアクセス してはならない点である。





Noriyo Kanayama 平成14年11月26日