C++入門/コマンドライン引数

柴田祐樹,東京都立大学,情報科学科
戻る

コマンドライン引数について説明する.Bash でコンパイルしたプログラムを実行するための知識があることを前提とする.この方法を学べば,プログラムを起動するときに,処理するべきファイルのパスなどを指定することができるようになる.

これは規約であるため,特に仕組みと言ったものを気にする必要はなく,次に示す例を覚えて貰えれば十分である.例えば,のプログラム excmd.cpp をコンパイルして,a.out があるとする.コンパイルのためのコマンドは以下のとおりである.

g++ excmd.cpp
#include <iostream>
int main(int argc, char** argv){
    for(int i=0;i<argc;++i){
        std::cout << argv[i] << "\n";
    }
    return 0;
}
excmd.cpp のソースコード

このとき,以下のコマンド

./a.out arg1 arg2

を実行すると次の通り出力されるはずである.

./a.out
arg1
arg2

このコード excmd.cpp の関数 main には二つの引数が記載されている.それらはそれぞれ,int 型の argc, char** 型の argv となっている.C++ の規約で,このように main を定義すると,プログラム起動時に渡された文字列を空白で区切った文字列の配列が argv に,その文字列の数が argc に渡されることとなっている.文字列自体は 「文字列」で解説したとおり配列にっているため,文字列を受け取るためには配列同様ポインタを受け取る必要がある.さらに,その文字列(配列)の配列を受け取るために,char* のポインタである char** を受け取ることになっている.ややこしいが,こういう決まりなので覚えていただきたい.私はこういった二重ポインタが必要な実装は良くないと思うが,規約なので覚えなくてはならない.

先程述べたプログラム起動時に渡された文字列,であるが,プログラムを起動するために必ずプログラム名を指定する必要があるため,argc は 0 になることはない.このことは,先ほどの出力に ./a.out が含まれていることからもわかる.この決まりにより,プログラムがどのように呼び出されたかを知ることができる.呼び出され方により処理を変えたい場合は argv の第一文字列を参考にすると良い.

argv の第2文字列以降は,プログラム名以降に渡された引数が入る.繰り返しになるが,例えば以下,

./a.out example

では argv に ./a.out, example の二つの文字列が入り,argc は 2 となる.文字列は空白で区切られると覚えておこう.空白を含む文字列を分割されないように渡したい場合は以下の通り,""で当該のものを囲い起動する.

./a.out example "this is a string including space"

上記の出力は次のとおりになるはずである.

./a.out
example
this is a string including space

以上参考にされたい.また,実はこのコマンドライン引数の受け渡しの決まりは,C++ 以外でもほぼ同じである.ここでは C++ での読み出し方を説明したが,他の言語を使う際も同様のことが可能であることを思い出してもらいたい.