01: プログラミング言語とは何か 02: 0から99まで印字するプログラムの解説 03: Pythonで書くと... 04: 変数と関数 05: 条件分岐とループ 06: プリプロセス 07: ポインタと配列1 08: ポインタと配列2 09: ポインタと配列3 0A: 文字列 0B: 多次元配列 0C: ファイル入出力 0D: 構造体 0E: コマンドライン引数 0F: 数値を読み込んで総和と平均を表示するプログラム 10: 数値を読み込んで総和と平均を表示するPythonプログラム 11:【番外編】文章中の単語を出現頻度順に表示するプログラム 12:【番外編】コマンドライン引数を処理するイディオム 13:【番外編】C言語でクロージャを実装する
C言語入門も,そろそろ終盤である.
締めくくりのお題として,コマンドライン引数の処理について解説する.コマンドライン引数とは
$ ./program parameter another_parameter yet_another_parameter
という風に,起動時にコマンドラインで与える引数である.この引数はmain関数に渡されるのだが,その渡されかたが少しばかりユニークである.
これまで何度も見てきたとおり,main関数は次のような引数を取る.
int main(int argc, char *argv[]) {
...
return 0;
}
main関数はint型引数1個と,charポインタの配列を引数として受け取る.上述のコマンドライン引数が与えられた場合,次の意味になる.
argc = 4;
argv[0] = "./program";
argv[1] = "parameter";
argv[2] = "another_parameter";
argv[3] = "yet_another_parameter";
argv[4] = 0;
argcとargvによる二重管理は,あまり快適なものではない.うまい処理方法は,次のような慣用句を使うことである.
void do_something(const char *parameter) {
printf("processing %s...", parameter);
...
printf("done\n");
}
int main(int argc, char *argv[]) {
while (--argc > 0) {
argv += 1;
do_something(*argv);
}
return 0;
}
--argcは argc -= 1 を縮めて書いたものである.代入と比較をwhile文の条件式で一気に行いたかったので,主義に反して単項--演算子を使っている.