2011-09-15 4 views
2

を割り当てるためのC++の文字列可能性の重複を解析:
パラメータ

How do I tokenize a string in C++?

Iがユーザ入力され、次の形式の文字列を有しています。ここ

a1 10.2 lib_t 50 sv 60 out 'true'

a1doubleのパラメータであり、その値は10.2あります。同様に、lib_t = 50,sv = 60およびout = 'true'は文字列です。

この入力は、単語の間にスペースが変化し得るようlib_t 50 a1 10.2

として..任意の順序で指定することができます。

編集: ブーストトークナイザがこれを処理できます。私は必要なコードを書いています。しかし、私はブーストライブラリを使用せずにこれを処理する他の標準的な方法があるかどうかを確認したい。

入力がかなり短くなっています。私はここで効率的ではありません(元の編集で「効率的」という言葉を使用して申し訳ありません)。

+0

「それ以外の効率的な方法」としてstrを定義する必要があります。 *効率*あなたは何を探していますか?最初に動作するコードを書いてから、効率とすべてを考えてください! – Nawaz

+0

ここには実際の質問はありません。少なくとも、私はそれを見ていません。 –

答えて

2
#include <sstream> 
#include <ostream> 
#include <istream> 
#include <string> 
#include <stdexcept> 

int main() { 
    std::string parameters = "a1 10.2 lib_t 50 sv 60 out 'true'"; 

    std::stringstream ss(parameters); 
    std::string param; 
    double a1; 
    int libt; //names ending in _t are not allowed 
    short sv; 
    std::string out; 
    while(ss >> param) { 
     if (param == "a1") 
      ss >> a1; 
     else if (param == "lib_t") 
      ss >> libt; 
     else if (param == "sv") 
      ss >> sv; 
     else if (param == "out") 
      ss >> out; 
     else { 
      std::stringstream err; 
      err << "unknown parameter type: \"" << param << "\""; 
      throw std::runtime_error(err.str()); 
     } 
     if (!ss) { 
      std::stringstream err; 
      err << "error parsing parameter: \"" << param << "\""; 
      throw std::runtime_error(err.str()); 
     } 
    } 
} 

http://ideone.com/zz1r8

これは、より最適化されたコードを作成することは可能ですが、これはかなり高速で、かつシンプルであるのに対し、それは、LOTより複雑になります。そして、あなたは十分にC++ 11コンパイラを準拠している場合は、AX(テストされていません)で、あなたの文法を書くことができます右に

+0

これは簡単です!ありがとうございました! – memC

+0

やや複雑なバージョン(http://ideone.com/SUg9G)を作成しました。 –

0

建てすべてのエラーチェックがあります。私はだまさ

std::string input = "a1 10.2 lib_t 50 sv 60 out 'true'"; 
double d; 
unsigned u; 
std::string str; 

auto space = axe::r_any(" \t"); 
auto a1_rule = *space & "a1" & +space & axe::r_double(d); 
auto lib_t_rule = *space & "lib_t" & +space & axe::r_unsigned(u); 
auto string_rule = axe::r_any() - '''; 
auto out_rule = *space & "out" & +space & ''' & string_rule >> str & '''; 

auto input_rule = +(a1_rule | lib_t_rule | out_rule) & *space & axe::r_end(); 
input_rule(input.begin(), input.end()); 

お知らせ最後のルールは、実際にはもっと許容的です。入力文字列が正しくない可能性があり、検証が必要な場合は、結合演算子と分離演算子を使用してより長いルールを作成し、すべての法的可能性を列挙できます。また、spacestring_ruleの実際の定義が何であるかを決定する必要があります。スペースを ''または '\ t'として定義するのが一般的です。この例のstring_ruleは、 '' 'を除くすべての文字を許可します。あなたはそれをより制限したいかもしれません。また、このパーサーは文字列だけでなく、他の入力コンテナとも動作することにも言及する価値があります。また、ワイド文字入力を解析するだけで、std::wstring str;

+0

私はAXに精通していませんが、 'r_unsigned(u)'を 'ax ::'で修飾するのを忘れたようです。 –

+0

@Mooing Duck - 正しいです。 –