C++ '='(等号)命令行参数

C++ Command-Line Arguments with '=' (Equal) Sign

本文关键字:命令行 参数 C++ 等号      更新时间:2023-10-16

如果C++中的命令行选项包含等号,我如何解析它?例如:

./testApp --parameter1=value1

我使用以下行检查参数是否存在:

bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
    return std::find(begin, end, option) != end;
}

但是,如果参数包含等号,则将返回false

cmdOptionExists(argv, argv+argc, "parameter1");

偶数打印:

for(int i=0;i<argc;i++)
        printf("Argument: %sn", argv[i]);

不包括参数1的任何指示。然而,删除等号将正确打印。

argv中的命令行选项以空格分隔。因此,要么必须自己检测key=value选项,要么使用命令行解析器。我建议Boost::程序选项。

示例:

namespace po = boost::program_options;
po::options_description desc("Allowed options");
desc.add_options()
    ("foo", po::value<std::string>(), "do bar")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
std::string foo;
if (vm.count("foo")) {
    foo = vm["foo"].as<std::string>();
} else {
    throw("Foo not set.");
}

您可以像解析其他内容一样解析它们。在您的例如,argv[1]可能包含"--parameter1=value1"。[1] 所以如果您想在'='处断开它,请使用std::find查找'=',我会先把它转换成std::string,但这个其实没有必要。对于以null结尾的字符串,如中所示argv[i]argv[i]是"开始"迭代器,argv[i] + strlen( argv[i] )是"结束"迭代机。

[1] 从形式上讲,标准实际上并没有对此做太多说明,因为所有这些都发生在程序执行之前。几乎然而,最常见的系统将允许调用你的程序几乎可以传递任何东西—即使对于CCD_ 12,标准确实有点规定。所有的贝壳或我知道的命令处理器会使用空白来分解命令在没有元字符的情况下,将行转换为单词。(考虑什么元角色,以及如何对待他们,差异很大。)