第29回
データ構造(8)~コマンドライン・パラメータの切り出し

パラメータで柔軟な指示を与える

プログラムの動作が複雑になると、それに与える指示──パラメータも複雑になってきます。main関数の2つの引数から複雑な指示を読み取る処理を考えてみましょう。

パラメータの種類と数を増やす

main関数の引数であるint型のargcはパラメータの数、char型ポインタの配列argvは切り出された各パラメータ文字列へのポインタの配列──という形をしています。

これら2つの引数を使って、前回はプログラムに与えられたシンプルなパラメータを読み出す処理を紹介しました。しかし、プログラムの処理内容によっては、たくさんのパラメータを必要とするものもあります。また、ユーザーの目的によって異なるパラメータを組み合わせる場合もよくあります。

前回の例では、ファイルから特定の文字列を探す“search”というプログラムを例に、
search <検索対象のファイル名> <検索する文字列>
という形で常に2つのパラメータを必要とする場合を取り上げました。

このプログラムの仕様は、もっと親切にできます。例えば、以下のような仕様が考えられます。

1)パラメータが指定されなければ、それらをプロンプトから入力できるようにする。
2)英単語の大文字と小文字を区別するか区別しないかを指定できるようにする。
3)単語が指定した数まで見つかったら処理を中止する。

オプション・スイッチを用いる

1)の機能は、パラメータの数を調べれば簡単に対応できそうです。しかし、続く2)の機能と絡めて仕様を考えると、ちょっと違った処理が必要になってきます。仕様をもう少し詰めてみましょう。

2)~3)の機能は『必要なら有効にすればよいけれど、通常は無効でも構わない』と考えてよいでしょう。そのような場合、“-”記号を伴ったオプション・スイッチで機能の有効/無効を切り替えられるようにするのが常道です。

ここでは、以下のようなオプション・スイッチを用いることにします。

-c:大文字/小文字を区別する。指定がなければ区別しない。
-n<number>:指定した数<number>まで見つかれば処理を中止する。
-f<file name>:検索対象のファイル名
-w<word>:検索対象の語

オプション・スイッチを省略した場合

上述のようなオプション・スイッチを適用すると、プログラムsearchの書式は以下のようになります。
search -c -n<number> -f<file name> -w<word>

すべてのパラメータは省略可能で、<file name>と<word>を省略するとプロンプトを表示してそれらの入力を促す──という仕様です。

-cを省略すると「大文字/小文字を区別しない」設定となります。
-nを省略すると、<word>で指定した語がすべて見つかるまで処理を続けます。
-nに続く<number>を省略した場合も、語がすべて見つかるまで処理を続けます。

また、オプション・スイッチの記述順序に規定はありません。どの順序で記述するかはユーザーの自由です。