SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C言語を使ったコンソールアプリケーションの作成
コマンドラインオプションの解析方法

PC-UNIX系の環境と同様に、Windows上にもgetopt関数を実装可能

より複雑なオプションを、getoptを用いて解析する

 先ほど見た例は、たった一つのオプションを解析したに過ぎませんでした。しかし、これではオプションが引数をとる場合や、オプションに渡す引数を省略可能な場合については対応できません。これに対処するための例として、リスト4では原点からオプションで指定したx,y座標までの距離を表示するプログラムを用意しました。

リスト4
/* getoptを利用した原点から指定した点の距離を表示するプログラム */
#include <stdio.h>
#include "getopt.h"

#include <stdlib.h>
#include <math.h>

void usage(char* name)
{
  printf("Usage:%s -x[val] -y[val]\n", name);
  exit(0);
}

int main(int argc, char *argv[])
{
	int c;
	int opt;
	double xval, yval;
	double dist;
	FILE *fp;

	if(argc < 2) {
		usage(argv[0]);
	}

	while( ( opt = getopt(argc, argv, "x:y:") ) != -1 ) {  //=== (a)
		switch( opt ) {
		case 'x' : xval = strtod(optarg, NULL); break;
		case 'y' : yval = strtod(optarg, NULL); break;
		case '?' : usage(argv[0]); break;
		}
	}

	argc -= optind;
	argv += optind;

	dist = sqrt( (xval * xval) +(yval * yval) );
	printf("原点からの距離は%fです\n", dist);

	return 0;
}

 このプログラムは

$ プログラム名 -x[val] -y[val]

 のように使うことで原点からx,yの引数で示された座標までの距離を表示するものです。間違ったオプションを指定した場合やオプションが指定されなかったときには、使い方を表示します。

 さて、さらにこのプログラムに改造を加えて、xとyの引数が省略された場合に、デフォルトの値としてx,yともに1.0という値を使うようにしたのがリスト5です。

リスト5
/* getoptを利用した原点から指定した点の距離を表示するプログラム引数省略版 */
#include <stdio.h>
#include "getopt.h"

#include <stdlib.h>
#include <math.h>

void usage(char* name)
{
  printf("Usage:%s -x[val] -y[val]\n", name);
  exit(0);
}

int main(int argc, char *argv[])
{
	int c;
	int opt;
	double xval, yval;
	double dist;
	FILE *fp;

	xval = yval = 1.0;

	if(argc < 2) {
		usage(argv[0]);
	}

	while( ( opt = getopt(argc, argv, "x::y::") ) != -1 ) { //=== (a)
		switch( opt ) {
		case 'x':
			if(optarg != 0)	xval = strtod(optarg, NULL);
			break;
		case 'y':
			if(optarg != 0) yval = strtod(optarg, NULL);
			break;
		case '?':usage(argv[0]); break;
		}
	}

	argc -= optind;
	argv += optind;

	dist = sqrt( (xval * xval) +(yval * yval) );
	printf("原点からの距離は%fです\n", dist);

	return 0;
}

 こちらはリスト4と違い、

$ プログラム名 -x -y

 といった具合に、オプションの引数を省略して実行できます。リスト5とリスト4の大きな違いは、ソースコード中に(a)で示した部分にあります。オプションに使いたい文字に続く:が一個ならば、そのオプションには引数が必要で、:が二個ならば引数を省略可能であるとgetoptに対して明示しています。例えば、リスト5で拡張された部分をそのままリスト4に入れると、確かに省略した状態で動きますが、xとyには引数が必要だという旨のエラーメッセージが表示されます。

 ここで、getoptの引数として指定する、オプションの文字列についてまとめます。

  • 基本的には、オプションとして使いたい文字を羅列した文字列を用いる(オプションがa,b,c,dならば"abcd"
  • 引数を取るオプション文字には、文字に続けて:を打つ
  • 引数の省略が可能なオプション文字には、文字に続けて::を打つ

次のページ
Windows環境でオプションを解析する

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

太田 晃(オオタ アキラ)

 ブログ(http://repse.blogspot.com/)では、coLinux上にMinGWを用いてクロスコンパイル環境を構築し、そのうえでSDLやOpenGLを使ってWindows向けのプログラムを書くとか、海外のソフトウェアを(勝手に)日本語化するとか、Windowsのインデックスサービ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4086 2009/07/23 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー