0
int next_option;
int keep_content =0;
int option_index = 0;
const string short_options = "c::";


 const struct option long_options[] = 
{ 

    {"config", optional_argument, NULL, 'c'},
    {"keep", no_argument, &keep_content, 1},
    { NULL,0, NULL, 0}
};

while((next_option = getopt_long(argc,argv,short_options.c_str(),long_options,&option_index))!= -1)
{
    cout << "name: " << long_options[option_index].name  << " " << "value: " << optarg << endl;
    cout << "keep_content: " << keep_content << endl;
}

上記のコードでは、引数をテストして解析を切り替えようとしています。次のテストが行​​われました。

a.out -chey  --> name: config value: hey  //which is correct 
a.out -c hey  --> name:  value:           //what's wrong?
a.out --confighey  --> name:  value:      //what's wrong?
a.out --config hey  --> name:  value:     //what's wrong?
a.out -chey --keep  --> name: config value: hey  keep_content: 0 // what's wrong? keep_content should be 1

正しい使い方を教えてください。私は何を間違っていますか?

お時間をいただきありがとうございます

4

1 に答える 1

1

オプションの引数が必要であり、次のman 3 getoptとおりです。

optstring は、正当なオプション文字を含む文字列です。このような文字の後にコロンが続く場合、オプションには引数が必要であるため、getopt() は、同じ argv 要素内の次のテキストへのポインター、または optarg 内の次の argv 要素のテキストへのポインターを配置します。 2 つのコロンは、オプションがオプションの引数を取ることを意味します。現在の argv 要素 (つまり、"-oarg" などのオプション名自体と同じ単語) にテキストがある場合、それは optarg に返されます。それ以外の場合、optarg はゼロに設定されます。 これは GNU 拡張です。optstring に W とそれに続くセミコロンが含まれている場合、-W foo は長いオプション --foo として扱われます。( -W オプションは、実装拡張のために POSIX.2 によって予約されています。)

于 2012-05-29T12:43:41.553 に答える