C のプログラムでは、コマンドライン引数を main() の2つの引数、argc と argv で受け取る。argc と argv という名前は決まったものではないらしいけど、伝統的のこの名前が使われているらしい。
argc は int 型で、コマンドライン引数の数を受け取る。argv は文字列ポインタの配列で、コマンドライン引数自体を受け取る。注意が必要なのは、コマンドラインに打ち込んだプログラム自体も含まれているということだ。なので、argc は 1 以上の整数になり、argv[0] にはプログラム名が入っている。
これらは次のように使う。
int main(int argc, char *argv[]) { .... }
*argv[] となっているのは、コマンドライン引数の数が決まっていないから。
ちょっと試してみよう。次のプログラムは、コマンドライン引数の数と、それぞれの引数を出力する。
#include int main(int argc, char *argv[]) { int i; printf("%d\n", argc); for (i = 0; i < argc; i++) { printf("%s\n", argv[i]); } return 0; }
実行例:
takatoh@nightschool $ ./sample_7_4a 1 ./sample_7_4a takatoh@nightschool $ ./sample_7_4a foo bar baz 4 ./sample_7_4a foo bar baz
さて、コマンドライン引数は文字列として渡されるので、もし数値として使いたいなら、文字列から数値へ変換しなければいけない。よく使われる関数は次のとおり。これらを使うには stdlib.h を include する必要がある。
int atoi(char *str); double atof(char *str); long atol(char *str);
long は long int のことね。
試してみよう。
#include #include int main(int argc, char *argv[]) { int i; double d; long l; i = atoi(argv[1]); d = atof(argv[2]); l = atol(argv[3]); printf("%d %f %ld\n", i, d, l); return 0; }
takatoh@nightschool $ ./sample_7_4 2 3.5 200000 2 3.500000 200000
ところで、1つ疑問な点がる。それは「char *argv[]」という宣言だ。
最初に argv は文字列ポインタの配列だと書いた。だけどこの宣言はそうは見えない。「char ch」なら文字変数、「char str[]」なら文字の配列(文字列)。だとすると「char *argv[]」は文字列のポインタじゃないのか。それとも [] よりも * のほうが結合強度が強くて文字ポインタの配列か。どちらにせよよくわからないな。