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 元素的文本。 两个冒号表示一个选项带有一个可选参数;如果当前 argv 元素中有文本(即,与选项名称本身在同一个词中,例如“-oarg”),则在 optarg 中返回,否则 optarg 设置为零。 这是一个 GNU 扩展。如果 optstring 包含 W 后跟分号,则 -W foo 被视为长选项 --foo。(POSIX.2 为实现扩展保留了 -W 选项。)

于 2012-05-29T12:43:41.553 回答