我想使用boost :: program_options解析多个命令行参数。但是,一些参数是用双引号括起来的字符串。这就是我所拥有的 -
void processCommands(int argc, char *argv[]) {
std::vector<std::string> createOptions;
boost::program_options::options_description desc("Allowed options");
desc.add_options()
("create", boost::program_options::value<std::vector<std::string> >(&createOptions)->multitoken(), "create command")
;
boost::program_options::variables_map vm;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
boost::program_options::notify(vm);
if(vm.count("create") >= 1) {
std::string val1 = createOptions[0];
std::string val2 = createOptions[1];
...
// call some function passing val1, val2.
}
}
当我这样做时,这很好用
cmdparsing.exe --create arg1 arg2
但 >>
时不cmdparsing.exe --create "this is arg1" "this is arg2"
从Windows命令行。对于第二个选项,它将在createOptions向量中转换为["this" "is" "arg1" "this" "is" "arg2"]
。因此,val1
得到"this"
和val2
<{1}}而不是"is"
和"this is arg1"
。
如何使用boost :: program_option使其工作?
答案 0 :(得分:2)
我使用本机Windows函数修复它,它以不同方式处理命令行参数。有关详细信息,请参阅CommandLineToArgvW。在将它传递给processCommands()之前,我正在使用上面提到的方法修改我的argv []和argc。感谢Bart van Ingen Schenau的评论。
#ifdef _WIN32
argv = CommandLineToArgvW(GetCommandLineW(), &argc);
if (NULL == argv)
{
std::wcout << L"CommandLineToArgvw failed" << std::endl;
return -1;
}
#endif
答案 1 :(得分:0)
您应该可以使用positional options
:
positional_options_description pos_desc;
pos_desc.add("create", 10); // Force a max of 10.
然后在解析命令行时添加此pos_desc
:
using namespace boost::program_options;
command_line_parser parser{argc, argv};
parser.options(desc).positional(pos_desc);
store(parser.run(), vm);
答案 2 :(得分:-1)
我会编写自己的命令行解析器,通过argv并手动解析选项。通过这种方式,您可以执行任何操作,无论是在"
上拆分还是仅在--
拆分,
cmdparsing.exe --create1 arg1 --create2 arg2
或
cmdparsing.exe --create \"First Arg\" \"Second Arg\"
通过手动操作,您可以节省时间并正确地实现您真正想要的内容,而不是与无法完成您想要的工作的图书馆作斗争。
(您需要\
,否则它将会被打破。