簡體   English   中英

boost :: program_options - 解析多個命令行參數,其中一些是包含空格和字符的字符串

[英]boost::program_options - parsing multiple command line arguments where some are strings including spaces and characters

我想使用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得到"is"而不是"this is arg1""this is arg2"

如何使用boost :: program_option使其工作?

我使用本機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

您應該能夠通過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);

我會編寫自己的命令行解析器,通過argv並手動解析選項。 這樣你可以做你想做的,無論是在分裂"或僅分裂上--在這樣的,

cmdparsing.exe --create1 arg1 --create2 arg2

要么

cmdparsing.exe --create \\"First Arg\\" \\"Second Arg\\"

通過手動操作,您可以節省時間並正確地實現您真正想要的內容,而不是與不能按照您希望的方式執行的庫進行斗爭。

(你需要\\或者它會被打破,因為你已經看到了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM