• ベストアンサー

コマンドラインのオプションの読み取り

C++で、引数に/オプションで処理ごとに実行するプログラムを書きたいのですが、具体的にmain関数でどう書けばよいのでしょうか? スマートの方法が知りたいです。 sample.exe /test=1 aの関数を実行 sample.exe /test=2 bの関数を実行 sample.exe /test=3 cの関数を実行 int main(int argc, char**argv) { ... ここの処理? } void a(){ print "A\n"; } void b(){ print "B\n"; } void c(){ print "C\n"; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

・一番左に書いた有効なオプションだけで判断し、一番目が無効で二番目以降に有効なオプションがあってもオプションを無視する場合 「sample.exe aaa /test=2 /test=1」では、何もしない。 int main(int argc, char**argv) {  if (strcmp("/test=1",argv[1]) == 0) a();  else if (strcmp("/test=2",argv[1]) == 0) b();  else if (strcmp("/test=3",argv[1]) == 0) c(); } ---------------------------- ・無効なオプションは無視し、複数のオプションを同時に指定した場合、一番右に書いたのだけ有効にする場合 「sample.exe aaa /test=2 /test=1」では、a()だけを実行する。 int main(int argc, char**argv) {  int fn = 0;  int i;  for (i = 1;i < argc;i++) {   if (strcmp("/test=1",argv[i]) == 0) fn = 1;   else if (strcmp("/test=2",argv[i]) == 0) fn = 2;   else if (strcmp("/test=3",argv[i]) == 0) fn = 3;  }  switch (fn) {   case 1: a(); break;   case 2: b(); break;   case 3: c(); break;   default: break;  } } ---------------------------- ・無効なオプションは無視し、複数のオプションを同時に指定した場合、一番左に書いたのだけ有効にする場合 「sample.exe aaa /test=2 /test=1」では、b()だけを実行する。 int main(int argc, char**argv) {  int fn = 0;  int i;  for (i = 1;i < argc;i++) {   if (strcmp("/test=1",argv[i]) == 0) { fn = 1; break; }   else if (strcmp("/test=2",argv[i]) == 0) { fn = 2; break; }   else if (strcmp("/test=3",argv[i]) == 0) { fn = 3; break; }  }  switch (fn) {   case 1: a(); break;   case 2: b(); break;   case 3: c(); break;   default: break;  } } ---------------------------- ・無効なオプションは無視し、複数のオプションを同時に指定した場合、すべて有効にする場合で、オプションの順番がどうでも実行順序を変えない場合 「sample.exe aaa /test=2 /test=1」では、a()を実行してからb()を実行する。 int main(int argc, char**argv) {  int fn1 = 0;  int fn2 = 0;  int fn3 = 0;  int i;  for (i = 1;i < argc;i++) {   if (strcmp("/test=1",argv[i]) == 0) fn1 = 1;   else if (strcmp("/test=2",argv[i]) == 0) fn2 = 1;   else if (strcmp("/test=3",argv[i]) == 0) fn3 = 1;  }  if (fn1 != 0) a();  if (fn2 != 0) b();  if (fn3 != 0) c(); } ---------------------------- ・無効なオプションは無視し、複数のオプションを同時に指定した場合、すべて有効にする場合で、オプションの順番に従って実行順序が変わる場合 「sample.exe aaa /test=2 /test=1」では、b()を実行してからa()を実行する。 int main(int argc, char**argv) {  int i;  for (i = 1;i < argc;i++) {   if (strcmp("/test=1",argv[i]) == 0) a();   else if (strcmp("/test=2",argv[i]) == 0) b();   else if (strcmp("/test=3",argv[i]) == 0) c();  } } ---------------------------- このように「プログラムの組み方が違うと、オプションの指定方法が同じでも、実行するしないの違い、実行する場合でも実行の順番が違う」ので、色々と試してみると良い。

その他の回答 (2)

回答No.2

数値型の値に変換して、switch文。 引数の数値が必ず、1,2,3で呼ばれる関数の型がすべてvoid(*)()であれば、 関数ポインタの配列ってのもあり。 >void a(){ print "A\n"; } コンパイル通りませんね。

回答No.1

「argc」と「argv」に渡される内容は理解されていますか? argcには、実行ファイル名も含めたパラメータ数 argvには、実行ファイル名も含めたパラメータ文字列 が入っています。この「数」と「文字列」は空白が区切りっなっているため、 実行ファイル名「sample.exe」だけなら、  argc=1  argv[0]="sample.exe\0" パラメータ付き「sample.exe /test=1」なら、  argc=2  argv[0]="sample.exe\0"  argv[1]="/test=1\0" が格納され渡されます。 このため、argv=2の時にargv[1]から必要なパラメータを取り出して条件分岐で関数を実行させます。

関連するQ&A

専門家に質問してみよう