main関数
プログラムの指示された開始点。
main関数は以下のように定義される。
int main (void) { body }
int main (int argc, char *argv[]) { body }
int argc, char *argv[]
の部分はコマンドライン引数という。
*argv[]
は**argv
とも表現できる。ダブルポインタ。
参考: main 関数 - cppreference.com
コマンドライン引数とは
コマンドライン引数とは、コンピュータのコマンド入力画面(コマンドライン)からプログラムを起動する際に指定する文字列のこと。また、これをプログラム側で受け取った変数などの値。
参考: コマンドライン引数とは - IT用語辞典 e-Words
main関数の引数はコマンドイラン引数と言われます。
コマンドライン引数は、プログラム実行時にOSに環境変数とともに指定するパラメータの1つです。
int main(int argc, char const *argv[])
の argc
, argv
がコマンドライン引数。実行コマンドを取得する。
$ ./a.out 100 abc
を実行すると中身は以下のようになる。
argc=3; // コマンドライン引数の数
argv[0]="./a.out";
argv[1]="100";
argv[2]="abc";
- argv[0]には必ずパスを含めたファイル名が入る。
- 厳密に言うと、
argv[0] がヌルでない場合、または argc > 0 である場合 (両者は同等です)、 argv[0] はプログラムの名前を表す文字列を指します。
- 厳密に言うと、
- 文字列として格納される。
がポイント
参考: コマンドライン引数
参考: Argument definition by The Linux Information Project (LINFO)
argc、argvとは
- argc
- "argument count"(引数の個数)の略
- argv
- "argument vector"(引数の配列)の略
引数文字列の"配列へのポインタ"のことを指している。
あくまで、初めに用意されている言葉なので、他の関数同様に型さえ一緒であれば、int main(int a, char const *b[])や、int main(int a, char const **b)でも有効。
いつも打っているコマンドってプログラムにコマンドライン引数を渡して実行しているってことか!
これで理解できました。コマンドって実行ファイルに引数を渡したりして、実行させている。
mkdir -p tests/test{1..5} && touch test/test1/file{3..5}.txt
とかも、実行ファイルに、コマンドイラン引数を使ってやり取りしているだけだった。コマンドは自分でも作れるということ。
参考: C言語-コマンドの作成-コマンドラインとオプションの取得
コードランナーとか使って自動的にcompile、実行とかしていて、この辺理解しないで進めていたので、ハッとしました。
おまけ1
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("argv[0]: %s\n", argv[0]);
printf("sizeof(argv[0]): %zu\n", sizeof(argv[0]));
printf("strlen(argv[0]): %zu\n", strlen(argv[0]));
return 0;
}
実行結果
./filepath/filename
sizeof(argv[0]): 8
strlen(argv[0]): 46
- argv[n]は文字列ではなく、文字列を示すポインタを格納している
- char str[] = "filename";のstrではなく、&strであるということ
- ポインタであるため、sizeof(argv)は8byteになる。
- strlenは指定されたアドレスからヌル終端文字までを取る。sizeof演算子との違いが改めて理解できた。
おまけ2
環境変数が第3引数として渡される環境もある。その場合、以下のコードで参照することができる。
#include <stdio.h>
int main(int argc, char** argv, char** envp)
{
for(int i = 0; envp[i]; i++)
puts(envp[i]);
}