C 言語の argc と argv

胡金庫 2023年10月12日
  1. C 言語でコマンドライン引数を取得するために int argc, char *argv[] 記法を使用する
  2. コマンドラインの引数を C 言語で連結するには memccpy を使用する
C 言語の argc と argv

この記事では、C 言語でコマンドライン引数 argcargv を利用するいくつかの方法について説明します。

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 配列の文字列を連結するために用いられます。memccpymemcpy と似ていますが、第 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Process