2017-06-06 9 views
1

私はC++を初めて使っています。メインのエミュレートargvからargvではなく配列iをパースするためのboostコマンドラインを取得

コマンドラインプログラムでboost program_optionsとcommandline parserを使用しようとしています。プログラムはgetl​​ineを使用して、ユーザーが入力したコマンドを取得します。私はそれを解析してブーストに渡すことができますが、タイプを正しく得ることはできません。私はまだポインターやジャズを正しく学んでいますが、苦労しています。

は、ここでは、私が何をしようとしているのアイデアを得ることができるようにコードです:

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

'_TCHAR'が何か親切なものとして定義されていると仮定すると、典型的な用法は' parse_command_line(argc、argv、desc) 'でしょう。詳細はこちら:[_TCHAR *をchar *に変換する](https://stackoverflow.com/questions/19301538/converting-tchar-to-char) – user4581301

答えて

1

char const*[]に分割することはできません。

は代わりに、のstd ::文字列のベクトルに分割し、必要なベクトルに変換:最初の引数(arg[0])はプログラム名

Live On Coliruでなければならないこと

#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"; 
    } 
} 

注意

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

ありがとうございます。 – user3238415

+0

@ user3238415ようこそ。あなたの分割はエスケープを扱わないので、一定のテストケースを使用する方が好きかもしれません:http://coliru.stacked-crooked.com/a/61293b6a2d860702 – sehe

関連する問題