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
你可以帮我理解正确的使用方法吗?我做错了什么?
感谢您的时间
答案 0 :(得分:1)
您期望一个可选参数,并且根据man 3 getopt
:
optstring是一个包含合法选项字符的字符串。如果这样的字符后面跟冒号,则该选项需要一个参数,所以getopt()放置一个 指向optarg中同一argv-element中的以下文本或以下argv-element的文本的指针。 两个冒号意味着一个选项需要一个可选的arg;如果有 当前argv-element中的文本(即与选项名称本身相同的单词,例如“-oarg”),然后在optarg中返回,否则optarg设置为零。 这是一个GNU扩展。如果optstring包含W后跟分号,那么-W foo被视为long选项--foo。 (-W选项由POSIX.2保留 实施扩展。)