2

如果 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: %s\n", argv[i]);

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

4

2 回答 2

5

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

例子:

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.");
}
于 2012-08-31T07:29:17.337 回答
1

您可以像解析其他任何内容一样解析它们。在您的示例中,argv[1]可能包含"--parameter1=value1".[1] 因此,如果您想在 处打断它'=',请使用std::find找到'='并打断它。我首先将其转换为std::string,但这并不是必需的。对于像您在 中找到的空终止字符串 argv[i]argv[i]是“开始”迭代器,argv[i] + strlen( argv[i] )是“结束”迭代器。

[1] 正式地,标准实际上并没有对此做太多说明,因为这一切都发生在程序中的任何内容执行之前。然而,实际上,最常见的系统将允许调用您的程序的程序传递几乎任何东西——甚至argv[0]是标准确实指定的 . 我知道的所有 shell 或命令处理器都将使用空格将命令行分解为单词,而无需元字符。(什么被认为是元字符,以及如何处理它们,差异很大。)

于 2012-08-31T07:57:25.460 回答