C++セミナー(中級)コマンドライン引数

何度も変更するようなパラメータをソースコード内に組み込むと変更のたびにコンパイルする必要が出るため,効率がよくありません.プログラムの実行時にパラメータを渡すことができるコマンドライン引数について紹介します.

目次

コマンドライン引数
エラー処理
演習

コマンドライン引数

コマンドライン引数とは,プログラムを実行する際にプログラムに与える引数のことを言います.初級では,main関数の引数は何もありませんでしたが,コマンドライン引数を利用する際には,メイン関数に引数を与えます.

int main(int argc, char **argv)
{
}

int型の引数は,コマンドライン引数の数が渡され,char**型の引数は,コマンドライン引数(文字列)が渡されます.例えば,コマンドラインで渡した文字列を表示するプログラムは以下のようになります.

#include <iostream>
int main(int argc, char **argv)
{
    std::cout << argv[1] << std::endl;
}

このプログラムをコンパイルして,実行する際に以下のように記述してください.

./a.out helloworld

上記を実行して,helloworldと表示されればOKです.

コマンドライン引数のargvの0番目の文字列には実行コマンドが格納されています(今回の場合は./a.out).

エラー処理

コマンドライン引数を使用したプログラム開発するときには注意が必要です.プログラマが引数を固定で3つ入力するようにプログラムを開発したにも関わらず,ユーザーがコマンドラインを何も入力しなかった場合,エラーが発生します.

int main(int argc, char **argv)
{
    std::cout << argv[3] << std::endl;  // 実行ファイルの後ろ3つ目コマンドを表示
}

上記のようなプログラムの際に,以下のようなコマンドで実行してみましょう.

./a.out 

上記の実行コマンドの場合,argvの要素数は1になりますが,プログラム上で3番目要素にアクセスしようとしています.そのため,エラーが生じてプログラムが強制終了してしまいます.

これを回避するために,argcの引数を活用します.

int main(int argc, char **argv)
{
    if(argc <= 3){
        std::cout << "Commandline error!" << std::endl;
        return -1;
    }
    std::cout << argv[3] << std::endl;  // 実行ファイルの後ろ3つ目コマンドを表示
}

このようにすることによって,不正な要素へのアクセスをする前に処理を停止させることができ,ユーザーにもエラー内容を通知することができます.

演習

3つの実数データを受け取って,それらの積を出力するプログラムを作成してください.(文字列から実数データへの変換が必要です.)