boost命令选项在从命令行读取时更改数据(这是boost中的错误吗?)

时间:2015-09-03 17:21:57

标签: c++ boost boost-program-options

我在boost :: program选项中有这个代码:

("output_path,o", po::value< std::string >(&outputPath)->implicit_value(""), "path to where the output should be created.")

在命令行上我有:

-o "C:\My Data\ImagesWithDifferentResolution\"

当boost选项用数据填充outputPath时,我在变量中得到这个值:

 C:\My Data\ImagesWithDifferentResolution"

注意路径末尾的额外报价。

我该如何解决?

编辑1

要明确这是一个提升中的错误。我知道在编译代码时我应该逃避字符串,但这是增强程序选项的工作方式并从命令行提取输入数据。

所以要解释一下:

我的程序名为testPrg.exe,我试图通过以下方式调用它:

 testprg.exe -o "C:\My Data\ImagesWithDifferentResolution\"

这是正确的,我的用户应该能够这样做。无需在命令行中转义\。

但是提升程序选项,错误地转换了最后的\&#34;成为逃避价值。

测试显示错误的应用程序:

main()
{
    po::options_description desc("Allowed options");
    std::string outputPath;
    desc.add_options()
    ("output_path,o", po::value< std::string >(&outputPath)->implicit_value(""), "path to where the output should be created.")
                ;
    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
    po::notify(vm);
    std::cout<<outputPath <<std::endl;
 }

使用boost 1.58编译cod并按照上面的说明运行它并检查输出。

1 个答案:

答案 0 :(得分:0)

这不是Boost.Program_options中的错误;它是编译器提供的Microsoft C / C ++启动代码的预期行为。也就是说,\""传递给main时已经转换为argv

从Visual Studio 2015参考中的Parsing C Command-Line Arguments开始:

  

以反斜杠\"开头的双引号被解释为文字双引号(")。

Command-Line Input | argv[1] | argv[2] | argv[3]
-------------------+---------+---------+---------
"ab\"c" "\\" d     | ab"c    | \       | d

可能的解决方法可能是调用GetCommandLine获取lpCommandLinepass that to split_winmain(尽管可能与Microsoft启动代码具有相同的行为)或自行拆分命令行。< / p>