2012-01-10 20 views
4
#include <iostream> 
#include <getopt.h> 

#define no_argument 0 
#define required_argument 1 
#define optional_argument 2 


int main(int argc, char * argv[]) 
{ 
    std::cout << "Hello" << std::endl; 

    const struct option longopts[] = 
    { 
    {"version", no_argument,  0, 'v'}, 
    {"help",  no_argument,  0, 'h'}, 
    {"stuff",  required_argument, 0, 's'}, 
    {0,0,0,0}, 
    }; 

    int index; 
    int iarg=0; 

    //turn off getopt error message 
    opterr=1; 

    while(iarg != -1) 
    { 
    iarg = getopt_long(argc, argv, "s:vh", longopts, &index); 

    switch (iarg) 
    { 
     case 'h': 
     std::cout << "You hit help" << std::endl; 
     break; 

     case 'v': 
     std::cout << "You hit version" << std::endl; 
     break; 

     case 's': 
     std::cout << "You hit stuff" << std::endl; 

     if(optarg) 
      std::cout << "Your argument(s): " << optarg << std::endl; 

     break; 
    } 
    } 

    std::cout << "GoodBye!" << std::endl; 

    return 0; 
} 

所望の出力:getopt_longを使用して複数の引数を解析するにはどうすればよいですか?

./a.out --stuff someArg1 someArg2 

Hello 
You hit stuff 
Your agument(s): someArg1 someArg2 
GoodBye! 
+0

実際の出力は何ですか? – Antti

+0

これは1つの引数だけをキャプチャします:実際の出力Hello あなたはものをヒットします あなたの議論:someArg1 GoodBye! – stackoverflow

答えて

7

のgetopt -1を返し、すべてのオプション引数が処理されました。 --stuffは、引数をとるオプション(この場合はsomeArg1)として認識されます。 someArg2引数は-または--で始まらないので、でなく、オプションです。既定では、これはargvの末尾に置換されます。 getoptは -1を返した後、すべての非オプションの引数はoptindargc-1からargvになります:あなたはoptstringの先頭に単一-を追加する場合

while (iarg != -1) { 
    iarg = getopt_long(argc, argv, "s:vh", longopts, &index); 
    // ... 
} 

for (int i = optind; i < argc; i++) { 
    cout << "non-option arg: " << argv[i] << std::endl; 
} 

getopt 1を返します(ない「1」 )と非オプションのパラメータをポイントoptarg

while (iarg != -1) { 
    iarg = getopt_long(argc, argv, "-s:vh", longopts, &index); 

    switch (iarg) 
    { 
     // ... 
     case 1: 
     std::cout << "You hit a non-option arg:" << optarg << std::endl; 
     break; 
    } 
} 
2

./a.out --stuff someArg1 someArg2では、シェルは、a.outの3つの引数を解釈します。あなたは、シェルは一つの引数として「someArg1 someArg2」を解釈したい - そう、引用符内の単語を置く:

./a.out --stuff "someArg1 someArg2" 
0

私は窓に取り組んでいるので、私はgetoptのをコンパイルしなければならなかったとthis excellent source

からのgetopt_long

2つの入力引数に対応するようにgetopt_long.c(下記)を修正しました。私は、複数の議論のより一般的なケースでは、時間がかかっていたよりも多くの(そしてよりクリーンな)リワークを必要とするので、気にしなかった。 2番目の引数は別のグローバル "optarg2"に置かれます。

ソースからgetoptをコンパイルする必要がない場合、上記のFrankの答えはよりエレガントです。

extern char * optarg2 
. 
. 
. 
int getopt_long(nargc, nargv, options, long_options, index) 
{ 
. 
. 
. 
if (long_options[match].has_arg == required_argument || 
      long_options[match].has_arg == optional_argument || 
      long_options[match].has_arg == two_req_arguments) { 
      if (has_equal) 
       optarg = has_equal; 
      else 
       optarg = nargv[optind++]; 
      if (long_options[match].has_arg == two_req_arguments) { 
       optarg2 = nargv[optind++]; 
      } 
     } 
     if ((long_options[match].has_arg == required_argument || 
      long_options[match].has_arg == two_req_arguments) 
      && (optarg == NULL)) { 
      /* 
      * Missing argument, leading : 
      * indicates no error should be generated 
      */ 
      if ((opterr) && (*options != ':')) 
       (void)fprintf(stderr, 
        "%s: option requires an argument -- %s\n", 
        __progname(nargv[0]), current_argv); 
      return (BADARG); 
     } 
     if ((long_options[match].has_arg == two_req_arguments) 
      && (optarg2 == NULL)) { 
      /* 
      * Missing 2nd argument, leading : 
      * indicates no error should be generated 
      */ 
      if ((opterr) && (*options != ':')) 
       (void)fprintf(stderr, 
        "%s: option requires 2nd argument -- %s\n", 
        __progname(nargv[0]), current_argv); 
      return (BADARG); 
     } 

また、あなたが合うように「two_required_args」または「multiple_args」のためにgetopt.hに定義を追加する必要があります。

編集:私はマークダウンで悪いです

関連する問題