2017-06-06 77 views
1

请原谅任何无知,我是新来的C++。得到升压命令行来解析我提供的数组而不是argv - 模仿argv

我想为我的命令行程序使用boost program_options和commandline解析器。该程序使用getline获取用户输入的一些命令。我想解析它,所以它可以通过提升,但我似乎无法得到正确的类型。我仍然在学习指针和所有爵士乐,但我有一段艰难的时光。

这里的代码,这样你可以得到什么,我试图做一个想法:

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

如果任何人都可以给我一只手或指向正确的方向,我将不胜感激。谢谢。

+0

我不知道你在跳过什么,但'parse_command_line'不需要'vector'。你可能会更好地发布你最初的尝试,因为这肯定是一条糟糕的道路。 – user4581301

+0

典型的用法是'parse_command_line(argc,argv,desc)',假设'_TCHAR'被定义为友好的。更多阅读这里:[将_TCHAR *转换为char *](https://stackoverflow.com/questions/19301538/converting-tchar-to-char) – user4581301

回答

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 
+0

非常感谢。 – user3238415

+0

@ user3238415不客气。请记住,您的分割不会处理转义,因此您可能更喜欢使用常量测试用例:http://coliru.stacked-crooked.com/a/61293b6a2d860702 – sehe