KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


コマンドライン引数を受け取るには?

コマンドラインで指定された引数を使うと、プログラムの応用の幅が広がることを知ろう

 

コマンドライン引数を利用したプログラム

 コマンドの引数と言っても、ピンとこない人も多いかと思います。例えばMS-DOSでは、dirというコマンドで現在のディレクトリのファイルを表示できますが、オプションを指定すると、表示が少し変わります。この「/w」オプションが、ここでいう引数です

 
C>dir

 ドライブ C: のボリュームラベルは  WINDOWS98
 ボリュームシリアル番号は 3436-1302
 ディレクトリは C:\WINDOWS\デスクトップ\lsi-c

.              <DIR>        99-03-13  18:47 .
..             <DIR>        99-03-13  18:47 ..
FOO      C             476  99-03-13  22:16 foo.c
         1 個                476 バイトのファイルがあります.
         2 ディレクトリ   426,921,984 バイトの空きがあります.

C>dir /w

 ドライブ C: のボリュームラベルは  WINDOWS98
 ボリュームシリアル番号は 3436-1302
 ディレクトリは C:\WINDOWS\デスクトップ\lsi-c

[.]             [..]            FOO.C
         1 個                476 バイトのファイルがあります.
         2 ディレクトリ   426,921,984 バイトの空きがあります.

C>

 もう一つ例を見てみましょう。WindowsからMS-DOSプロンプトを起動し、以下のように書くと、c:\windows\tips.txtを読みこんだメモ帳が起動されます。この「c:\windows\tips.txt」も、ここでいう引数にあたります

 
C>notepad c:\windows\tips.txt

C>

この例は重要で、Windowsでは関連付けの機能により、テキストファイルをダブルクリックすると、裏でこのようなことと同じ事が実行されています(別にMS-DOSを起動してやっているわけではないのですが)。よって、このような引数に対応した自分で作ったプログラムと、ある拡張子を関連付ければ、エクスプローラなどでそのファイルをダブルクリックするだけで、そのファイルが開かれたプログラムを起動させることができるようになるのです。

 

main関数の隠された引数

 いままでmain関数には引数は指定していませんでしたが、じつはmain関数の引数でコマンドラインの引数を受け取ることができます。引数は必ず次のような型になっています。

  main(int argc, char *argv[])

argcにはコマンド名も含んだ、コマンドライン引数の個数が入ります。argvには、それぞれのコマンドライン引数へのポインタが入ります。このようにargvは配列になっているので、引数をいくつ渡しても処理できるようになっています。例えば、渡された全ての引数を表示するプログラムは、以下のように作ることができます。

 
#include <stdio.h>

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

 そして、このプログラムを実行すると、次のようになります。

 
C>cmdline foo bar
0: C:\WINDOWS\デスクトップ\LSI-C\CMDLINE.EXE
1: foo
2: bar

C>cmdline "foo bar"
0: C:\WINDOWS\デスクトップ\LSI-C\CMDLINE.EXE
1: foo bar

C>

 このように、argv[0]の内容は、自分自身のプログラムの名前になっています。この情報を使って、自分のディレクトリを知るということもできます。また、Windows環境の場合、ファイル名の中にスペースが入ることがありますが、そのようなファイルを指定したい場合は、このようにダブルコーテーションマークで囲めばいいことが分かります。

 

main関数の戻り値は?

 main関数の引数は分かりました。では、main関数の戻り値はどうなるのでしょうか? 実はC++では、main関数の戻り値はint型でなくてはならないと決められています。C言語でもそうするほうが良いでしょう。main関数の引数はOSによって渡されていますが、戻り値も同じようにOSへ返されています。しかし、あまりこれについては意識しなくても良いでしょう。通常は終了するときに「0」を返し、異常終了するときにその他の値を返します。

 この戻り値はどのように利用されているのでしょうか。MS-DOSの場合、バッチファイルで処理するときに「ERRORLEVEL」として扱うことがあります。例えば以下のようなプログラムは、引数を渡すと0、渡さないと1を返します。

 
#include <stdio.h>

int main(int argc, char *argv[])
{
  return argc==1;
}

このプログラムをERR.EXEとして、以下のようなバッチファイルを作ります。

 
@echo off
err %1
if errorlevel 1 echo 引数を指定してください。

このバッチファイルは、引数をERR.EXEに渡して、errorlevelが1なら「引数を指定してください」と表示するものです。このバッチファイルをTEST.BATとしておくと、実行結果は以下のようになります。

 
C>test
引数を指定してください。
C>test foo
C>

 これはあまりにもつまらない例ですが(だったらやるな、という批判は置いておいて...)、戻り値はどのように利用されるのかという一例をあげておきました。

 

まとめ。

  1. コマンドライン引数は、オプションやファイルをプログラムに渡すために使える
  2. WindowsなどのOSでは、ファイルをダブルクリックすると、ファイルをプログラムのコマンドライン引数に渡して起動する
  3. コマンドラインの引数は、main関数の引数として渡される
  4. main関数の戻り値はOSに返されるが、あまり利用価値はない

(1999/03/13 公開)

[目次へ] [次へ]

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて