C コマンドライン引数
プログラムを実行するとき、コマンドラインから C プログラムに値を渡すことができます。これらの値はコマンドライン引数と呼ばれ、プログラムにとって重要です。特に、コード内でこれらの値をハードコーディングするのではなく、外部からプログラムを制御したい場合に、非常に重要になります。
C 言語では、コマンドライン引数はコマンドラインから入力を受け取る方法であり、プログラムの実行時に情報をプログラムに渡すために使用できます。コマンドライン引数は main 関数の引数を介してプログラムに渡されます。main 関数のプロトタイプは、次の 2 つの形式のいずれかにできます:
int main(int argc, char *argv[]);
または:
int main(int argc, char **argv);
argc(argument count):は、プログラム名自体を含むコマンドライン引数の数を表します。したがって、argc少なくとも 1 になります。argv(argument vector):は、文字列配列へのポインタです。各文字列はコマンドライン引数です。配列の最初の要素(すなわちargv[0])は通常、プログラム名です。次の要素は、プログラムに渡されるコマンドライン引数です。
以下は、コマンドラインに引数が提供されているかどうかを確認し、引数に応じて対応する動作を実行する簡単な例です:
例
int main( int argc, char *argv[] )
{
if( argc == 2 )
{
printf("The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )
{
printf("Too many arguments supplied.\n");
}
else
{
printf("One argument expected.\n");
}
}
1 つの引数を使用して、上記のコードをコンパイルして実行すると、次の結果が得られます:
$./a.out testing The argument supplied is testing
2 つの引数を使用して、上記のコードをコンパイルして実行すると、次の結果が得られます:
$./a.out testing1 testing2 Too many arguments supplied.
引数を渡さずに、上記のコードをコンパイルして実行すると、次の結果が得られます:
$./a.out One argument expected
注意すべき点は、argv[0]はプログラム名を格納し、argv[1]は最初のコマンドライン引数を指すポインタであり、*argv[n] は最後の引数です。引数が何も提供されない場合、argc は 1 になります。そうでなければ、1 つの引数が渡された場合、argcは 2 に設定されます。
複数のコマンドライン引数はスペースで区切られます。ただし、引数自体にスペースが含まれる場合は、引数を渡すときに二重引用符 "" または単引用符 '' の中に配置する必要があります。上記の例を書き直してみましょう。スペースがある場合は、二重引用符または単引用符 """" の中に配置します。上記の例を書き直して、二重引用符の中に配置したコマンドライン引数をプログラムに渡してみましょう:
例
int main( int argc, char *argv[] )
{
printf("Program name %s\n", argv[0]);
if( argc == 2 )
{
printf("The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )
{
printf("Too many arguments supplied.\n");
}
else
{
printf("One argument expected.\n");
}
}
スペースで区切られた単純な引数(二重引用符で囲まれた引数)を使用して、上記のコードをコンパイルして実行すると、次の結果が得られます:
$./a.out "testing1 testing2" Progranm name ./a.out The argument supplied is testing1 testing2
使用シナリオ
コマンドライン引数は、多くの場合に役立ちます。例えば:
- 設定ファイルのパス
- モードの選択(例:デバッグモード)
- 入力ファイル名と出力ファイル名
- 実行時オプションとフラグ(例:
-vは詳細モードを表します)
注意事項
- コマンドライン引数は通常文字列です。数値型に変換する必要がある場合は、標準ライブラリ関数を使用できます。例:
atoi或strtol。 - 入力エラーや悪意のある入力を防ぐために、常にコマンドライン引数を検証して処理する必要があります。