GETOPT(3) — NEWS-OS Programmer’s Manual
名称
getopt − argv からオプション文字を得る
形式
int getopt(argc, argv, optstring)
int argc;
char ∗∗argv;
char ∗optstring;
extern char ∗optarg;
extern int optind;
解説
getopt は、 argv の中で optstring の文字にマッチする、 次のオプション文字を返します。 optstring は、 認識されるオプション文字から成る文字列です。 文字の後にコロンが続く場合には、 そのオプションは、 空白で区切られることもある引数を 1 つ持つと見なされます。 getopt からの戻り時に、 optarg はそのオプションの引数の先頭を指すようにセットされます。
getopt は、 次に処理される引数の argv の添え字を、 optind の中に置きます。 optind は外部変数ですから、 普通は getopt の最初の呼び出しの前に、 自動的にゼロに初期化されます。
すべてのオプションが処理されたときには (すなわち、 最初の非オプション引数)、 getopt は EOF を返します。 特別オプションの −− を使用して、 オプションの終わりの境界を 定めることができます。 この場合 EOF が返され、 −− は読み飛ばされます。
診断
getopt はエラーメッセージを stderr 上に出力し、 optstring に含まれていないオプション文字があると、 疑問符 (?) を返します。
例
次のプログラムの一部分は、 コマンドへの引数を 処理する方法を 示しています。 このコマンドは、 互いに排他的なオプションの a および b、 引数を 要求するオプションの f と o を取ります。
main(argc, argv)
int argc;
char ∗∗argv;
{
int c;
extern int optind;
extern char ∗optarg;
.
.
.
while ((c = getopt(argc, argv, "abf:o:")) != EOF)
switch (c) {
case ‘a’:
if (bflg)
errflg++;
else
aflg++;
break;
case ‘b’:
if (aflg)
errflg++;
else
bproc();
break;
case ‘f’:
ifile = optarg;
break;
case ‘o’:
ofile = optarg;
break;
case ‘?’:
default:
errflg++;
break;
}
if (errflg) {
fprintf(stderr, "Usage: ...");
exit(2);
}
for (; optind < argc; optind++) {
.
.
.
}
.
.
.
}
履歴
Bell Labs のマニュアルを元に Henry Spencer が書き、 Keith Bostic がさらに System V バージョンに似せて動作するよう修正しました。
バグ
‘−’が単独で現われた場合に、 どう対処するかは不明です。 このバージョンでは、 これを非オプション引数として扱います。 しかし、 この扱いが常に良いわけではありません。
オプションの引数は、 ‘−’で始まります。 これは合理的ですが、 エラー検査の可能性を かなり減少します。
getopt はかなり柔軟ですが、 明らかにその代償もあります。 相互に排他的なオプションの検査、 オプションの引数の型検査 等のように、 やってはいないけれども、 やるべきことはかなりあります。
NEWS-OSRelease 4.2.1R