2017-06-06 27 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