implicit_value(""), "path to whe-6ren">
gpt4 book ai didi

c++ - 当从命令行读取时,boost程序选项会更改数据(boost中的错误吗?)

转载 作者:行者123 更新时间:2023-12-01 14:55:44 25 4
gpt4 key购买 nike

我在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

要明确的是,这是提升的错误。我知道我在编译代码时应该对字符串进行转义,但这是boost程序选项起作用并从命令行提取输入数据的方式。

因此,请解释一下:

我的程序名为testPrg.exe,我尝试通过以下方式调用它:
 testprg.exe -o "C:\My Data\ImagesWithDifferentResolution\"

正确,我的用户应该可以执行此操作。无需在命令行上转义\。

但是,boost程序选项错误地将最后一个\转换为转义值。

显示错误的测试应用程序:
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编译鳕鱼,并按上述说明运行,并检查输出。

最佳答案

这不是Boost.Program_options中的错误;这是编译器提供的Microsoft C / C++启动代码的预期行为。也就是说,\"在传递给"中的main时已经转换为argv
在Visual Studio 2015引用中的Parsing C Command-Line Arguments中:

A double quotation mark preceded by a backslash, \", is interpreted as a literal double quotation mark (").

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

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

关于c++ - 当从命令行读取时,boost程序选项会更改数据(boost中的错误吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32381884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com