C 言語の argc と argv
この記事では、C 言語でコマンドライン引数 argc
と argv
を利用するいくつかの方法について説明します。
C 言語でコマンドライン引数を取得するために int argc, char *argv[]
記法を使用する
プログラムが実行されるとき、ユーザはコマンドライン引数と呼ばれるスペースで区切られた文字列を指定することができます。これらの引数はプログラムの main
関数で利用可能であり、個々のヌル文字で終端する文字列として解析することができます。引数にアクセスするには、int argc, char *argv[]
のようにパラメータを指定し、渡された引数の数とコマンドライン引数を含む文字列の配列を表す必要があります。配列の最初の文字列は規約通りにプログラム名そのものであり、したがって、引数の数 argc
にはプログラム名が含まれています。以下の例で示すように、argv
配列を単純に繰り返すだけで、すべてのコマンドライン引数を表示することができます。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
for (int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
exit(EXIT_SUCCESS);
}
サンプルコマンド
./program hello there
出力:
argv[0] = ./program
argv[1] = hello
argv[2] = there
配列 argv
はヌル文字で終端する文字列であり、最後の引数を示す NULL
ポインタで終端します。このように、この機能を利用して argv
ポインタ自体を評価して NULL
が等しくなるまでインクリメントすることで、引数出力ループを実装することができます。プログラムの後半で配列の元のアドレスが必要になった場合に備えて、ループ用の char*
ポインタを別個に作っておいた方が良いことに注意してください。以下のサンプルコードは、先ほどの例と同じコマンドが実行されたと仮定しています。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char **ptr;
for (ptr = argv; *ptr != NULL; ptr++) printf("%s\n", *ptr);
exit(EXIT_SUCCESS);
}
出力:
./program
hello
there
コマンドラインの引数を C 言語で連結するには memccpy
を使用する
関数 memccpy
は標準ライブラリの文字列ユーティリティの一部であり、argv
配列の文字列を連結するために用いられます。memccpy
は memcpy
と似ていますが、第 4 引数にコピーを停止する文字を指定することを除いては、memcpy
と似ています。後者の機能を利用して、文字列の内容のみをコピーし、ヌルバイトで終了するようにします。次の例では、ユーザが正確に 2つの引数(プログラム名を除く)を与えたかどうかを確認し、プログラムの実行を継続するだけです。結果として、2つの memccpy
呼び出しを連鎖させて両方の引数をコピーし、連結した文字列を stdout
に出力します。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: ./program string1 string2\n");
exit(EXIT_FAILURE);
}
size_t size = strlen(argv[1]) + strlen(argv[2]);
char buf[size];
memccpy(memccpy(buf, argv[1], '\0', size) - 1, argv[2], '\0', size);
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
出力:
hellothere