获取boost命令行来解析数组i而不是来自main的argv - 模拟argv

时间:2017-06-06 00:38:46

标签: c++ parsing boost command-line-interface argv

请原谅任何无知,我是c ++的新手。

我试图在命令行程序中使用boost program_options和命令行解析器。该程序使用getline来获取一些用户输入的命令。我想解析它,所以它可以传递给boost,但我似乎无法使这些类型正确。我还在学习指针和所有爵士乐,但我很难过。

以下是代码,以便您了解我尝试做的事情:

namespace po = boost::program_options;

int _tmain(int argc, _TCHAR* argv[])
{
    std::string input;
    _TCHAR* parsedInput[20];

    while (std::cin) {
        std::getline(std::cin, input);
        boost::split(parsedInput, input, boost::is_any_of(" "), boost::token_compress_on);

        po::options_description desc("allowed options");
        desc.add_options()
            ("help", "produce help message")
            ("compression", po::value<int>(), "set compression level")
        ;

        po::variables_map vm;
        po::store(po::parse_command_line(5, parsedInput, desc), vm);
        po::notify(vm);

        if (vm.count("help"))
            std::cout << desc << "\n";
    }

    return 0;
}

po::store(po::parse_command_line(5, parsedInput, desc), vm);当我试图让这项工作正常时,5是任意的。

使用代码我并不完全确定我的问题是什么,但我认为它实际上与分割输入有关,这是当前的错误消息error C2078: too many initializers

我最初将输入分成了一个字符串向量,这让我超过了那个错误,但是我遇到了po::parse_command_line(5, parsedInput, desc)采用错误类型的问题,我认为它不能采用字符串向量。看了documentation之后的确如此。

如果有人能帮助我或指出我正确的方向,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您无法拆分为char const*[]

相反,将其拆分为std :: string的向量并转换为所需的向量:

#include <boost/program_options.hpp>
#include <boost/algorithm/string.hpp>
#include <iostream>

namespace po = boost::program_options;

int main()
{
    std::string input;

    while (std::cin) {
        std::getline(std::cin, input);

        std::vector<std::string> parsedInput;
        boost::split(parsedInput, input, boost::is_any_of(" "), boost::token_compress_on);

        std::vector<char const*> args { "command" };
        for (auto& arg : parsedInput)
            args.push_back(arg.c_str());

        po::options_description desc("allowed options");
        desc.add_options()
            ("help", "produce help message")
            ("compression", po::value<int>(), "set compression level")
        ;

        po::variables_map vm;
        po::store(po::parse_command_line(args.size(), args.data(), desc), vm);
        po::notify(vm);

        if (vm.count("help"))
            std::cout << desc << "\n";
    }
}

请注意,第一个参数(arg[0])应该是程序名称

<强> Live On Coliru

allowed options:
  --help                produce help message
  --compression arg     set compression level