日頃より、Linux のコンソール上で、ワイルドカード「*(アスタリスクと読む)」を使用して複数のファイルを扱っているだろう。たとえば、以下のようにするとC言語のヘッダファイルだけを表示することができる。
# ls *.h array2dint.h mypicture.h pgmimage.h |
ワイルドカードから具体的なファイル名への変換は、コンソール側(シェル側)が処理してくれる。C言語のプログラム側では、変換後の具体的なファイル名を配列変数として受けとる。
次のプログラムを実行して、動作を確認してみよう。
/* list0601.c */ #include <stdio.h> int main(int argc, char **argv) { int i; for(i = 0; i < argc; i += 1 ){ printf("%s\n", argv[i]); } return 0; } |
(実行例) # gcc -Wall -o list0601 list0601.c # ./list0601 ~/* |
main 関数の第1引数は、配列変数 argv のサイズである。第2引数は、配列変数である。この配列変数は、1つの要素が char * の型であり、つまり、文字列である。argvは 0 番目から argc - 1 番目までが参照可能である。
argv[0] は、コマンドである。コンソールで入力したコマンドに、パスが付与されている。argv[1] 以降が、ワイルドカードの変換後のファイル名である。
F1選手の写真を格納したディレクトリから、名前と苗字のどちらか、または、両方に「A」が含まれている人物のファイル名を列挙するように、ワイルドカードを指定しよう。それを、list0601 を用いて動作確認をしよう。
たとえば、名前のどこかに「v」が含まれている人物は、「./list0601 ../lect03/PGM/*v*.pgm」とすると「04_Heikki_Kovalainen.pgm、14_David_Coulthard.pgm、23_Anthony_Davidson.pgm」が表示される。
ただし、「../lect03/PGM/」の部分は、各自の実行環境に合わせて変更せよ。
実行の様子を以下に示す:
# make prac0601 gcc -Wall -O3 -c namecard.c gcc -Wall -O3 -o prac0601 prac0601.c namecard.o # ./prac0601 ../lect03/PGM/*b*.pgm ../lect03/PGM/08_Rubens_Barrichello.pgm ../lect03/PGM/10_Robert_Kubica.pgm ../lect03/PGM/15_Mark_Webber.pgm ../lect03/PGM/16_Nico_Rosberg.pgm ../lect03/PGM/21_Christijan_Albers.pgm |
上記課題を解決し、レポートに、namecard.h、namecard.c、prac0601.c および実行結果を掲載せよ。