C++におけるコマンドライン引数の解析方法を徹底解説
C++プログラムは、実行時にコマンドラインから値を受け取ることができます。これらの値はコマンドライン引数(command line arguments)と呼ばれ、プログラムの外部から動作を制御したい場合や、設定値をソースコード内にハードコードせずに柔軟に扱いたい場合に非常に重要な役割を果たします。
コマンドライン引数は、main()関数の引数として処理されます。ここで使われる2つのパラメータの意味は以下のとおりです。
- argc:プログラムに渡された引数の総数(プログラム名自身も含まれます)
- argv[]:渡された各引数へのポインタを保持する配列(
argv[0]には通常プログラム名が格納され、実際の引数はargv[1]以降に入ります)
以下は、コマンドラインから引数が渡されたかどうかを確認し、その個数に応じて処理を分岐するシンプルなサンプルです。
サンプルコード
#include <iostream>
using namespace std;
int main( int argc, char *argv[] ) {
if( argc == 2 ) {
cout << "The argument supplied is "<< argv[1] << endl;
} else if( argc > 2 ) {
cout << "Too many arguments supplied." <<endl;
}else {
cout << "One argument expected." << endl;
}
}
実行結果
引数が1つ渡された場合
$./a.out testing The argument supplied is testing
引数が1つだけ指定されたため、argv[1]の内容である「testing」が出力されています。
引数が複数渡された場合
$./a.out testing1 testing2 Too many arguments supplied.
argcが2より大きくなるため、「引数が多すぎます」というメッセージが表示されます。
引数が渡されなかった場合
$./a.out One argument expected
この場合、argcは1(プログラム名のみ)となるため、elseブロックが実行されます。
ポイントまとめ
- コマンドライン引数は
main(int argc, char *argv[])の形式で受け取るのが基本です。 argcにはプログラム名自体もカウントされるため、実際の引数の数はargc - 1となります。- 数値として扱いたい場合は、
atoi()やstoi()などで文字列から変換する必要があります。 - 本格的な解析には、Boost.Program_optionsやgetoptなど専用ライブラリの活用も検討するとよいでしょう。
-
C++で点集合の線対称(ラインリフレクション)を判定するアルゴリズム
問題概要2次元平面上にn個の点が与えられます。このとき、y軸に平行な直線で全ての点を鏡映(反射)した結果が、元の点集合と完全に一致するような直線が存在するかどうかを判定します。言い換えれば、ある直線を対称軸として全ての点を反転させたとき、反転後の点の集合が元の集合と同一になるかを確認する問題です。例えば、入力が points = [[1,1],[-1,1]] の場合を考えてみましょう。この場合、x = 0 の直線(y軸)を対称軸とすると、点 (1,1) は (-1,1) へ、(-1,1) は (1,1) へと移ります。点集合全体としては変化がないため、出力は true となります。解法のポイン
-
C++で線分の中点を求める方法とサンプルコード
本記事では、C++を使って線分の中点(ミッドポイント)を求めるプログラムの作成方法を解説します。線分の始点Aと終点Bの2つの座標が与えられたとき、その中点を計算するアルゴリズムについて学びましょう。 問題の概要 始点A(x1, y1)と終点B(x2, y2)で構成される線分があります。この線分の中点を求めるのが課題です。 入力例 a(x1, y1) = (4, -5) b(x2, y2) = (-2, 6) 出力例 (1, 0.5) 計算の説明 (x1 + x2)/2 = (4 + (-2)) / 2 = 1 (y1 + y2)/2 = (-5 + 6) / 2 = 0.5 解決アプローチ:中