コマンドライン環境

コマンドラインパラメータ

C 言語プログラムはコマンド ラインから引数を受け取ることができます。

$ ./foo ハローワールド

上の例では、プログラム foo は 2 つのコマンド ライン パラメータ helloworld を受け取ります。

プログラム内のコマンドラインパラメータを取得するにはどうすればよいですか? C 言語は、コマンドラインに入力された内容を配列に入れます。 main() 関数のパラメータはこの配列を受け取ることができます。

#include <stdio.h>

int main(int argc, char* argv[]) {
  for (int i = 0; i < argc; i++) {
    printf("arg %d: %s\n", i, argv[i]);
  }
}

上記の例では、main() 関数には 2 つのパラメータ argc (引数の数) と argv (引数の変数) があります。これら 2 つのパラメータの名前は任意ですが、一般的には、これら 2 つの単語を使用するのが慣例です。

最初のパラメータ argc はコマンドライン引数の数です。プログラム名もカウントされるため、厳密には argc は引数の数 + 1 になります。

2 番目のパラメータ argv はすべてのコマンド ライン入力を保存する配列で、その各メンバーは文字列ポインタです。

./foo hello world を例にとると、argc は 3 で、コマンド ライン入力に 3 つのコンポーネントがあることを示します: ./foohelloworld。配列 argv はこれらの入力を取得するために使用されます。 argv[0] はプログラム名 ./fooargv[1]helloargv[2]world です。一般に、「argv[1]」から「argv[argc - 1]」まではすべてコマンドラインのパラメータです。 argv[argc] はヌルポインタ NULL です。

文字列ポインタは文字配列とみなすことができるため、次の 2 つの書き方は同等です。

//書き方その1
int main(int argc, char* argv[])

//書き方2
int main(int argc, char** argv)

一方、各コマンドライン引数は、配列形式 argv[i] またはポインタ形式 *(argv + i) のいずれかで記述することができます。

argc を使用すると、関数が持つことができるパラメータの数を制限できます。

#include <stdio.h>

int main(int argc, char** argv) {
  if (argc != 3) {
     printf("使用法: mult x y\n");
     1を返します。
  }

  printf("%d\n", atoi(argv[1]) * atoi(argv[2]));
  0を返します。
}

上記の例では、「argc」が「3」に等しくない場合、エラーが報告され、プログラムを実行する前にパラメータが 2 つまでに制限されます。

さらに、argv 配列の最後のメンバーは NULL ポインター (argv[argc] == NULL) です。したがって、パラメータトラバーサルは次のように書くこともできます。

for (char** p = argv; *p != NULL; p++) {
  printf("引数: %s\n", *p);
}

上の例では、ポインタ p が順番に移動し、argv の各メンバーを指し、ヌル ポインタ NULL に移動すると、トラバーサルの終了を示します。 argv のアドレスは固定されており、自動インクリメント演算 (argv++) を実行できないため、トラバーサル演算は中間変数 p を介して完了する必要があります。

終了ステータス

C 言語では、「main()」関数に「return」ステートメントがない場合、実行終了時にデフォルトで「return 0」が追加され、整数「0」が返されると規定されています。これが、main() ステートメントが通常整数値を返し、整数 0 が返されることはプログラムが正常に実行されたことを示す理由です。ゼロ以外の値が返された場合は、プログラムに問題があります。

Bash の環境変数 $? を使用すると、前のコマンドの戻り値を読み取り、コマンドが正常に実行されたかどうかを知ることができます。

$ ./foo ハローワールド
$エコー$?
0

上記の例では、環境変数 $? の値を出力するために echo $? が使用されています。値が 0 の場合は、前のコマンドが正常に実行されたことを意味し、それ以外の場合は失敗しました。

デフォルトで「return 0」を追加するのは「main()」だけであり、他の関数にはこのメカニズムがないことに注意してください。

環境変数

C 言語には、コマンドライン環境変数を読み取るための getenv() 関数 (プロトタイプは stdlib.h にあります) が用意されています。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char* val = getenv("HOME");

  if (val == NULL) {
    printf("HOME 環境変数が見つかりません\n");
    1を返します。
  }

  printf("値: %s\n", val);
  0を返します。
}

上記の例では、getenv("HOME") を使用してコマンド ライン環境変数 $HOME を取得しています。この変数が空 (NULL) の場合、プログラムはエラーを返します。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0