2016-10-28 7 views
1

文字、演算子または数値を含む文字列を読み込んでベクトルに配置する関数を作成しようとしています。私は、ベクトルの1桁に複数桁の数字を配置する方法を見つけるのに苦労しています。これは私が持っているものです。どんな助けもありがたいですベクトルに文字列を追加しようとしています

vector <string> getTokens (string token){ 

    int a = (int) token.length(); 
    string temp; 
    vector <string> numbers; 

    char t; 

    for (int i =0; i <a; i++){ 

     t = token[i]; 

     if (isdigit(t)){ //should i be using a while loop? 

      numbers.at(i).push_back(t); 
      //seg fault here 
     } 

     else if (t=='+' || t=='-' || t=='/' || t=='*' || t=='^'){ 
      cout << "operator" <<endl; 
      string tt; 
      tt+=t; 
      numbers[i] = tt; 
     }  


     else if (t=='(' || t==')'){ 
      string tt; 
      tt += t; 
      numbers[i] = tt; 
     } 
+1

'numbers'の世話をすることは*空*です。インデックス作成は範囲外になります。文字列を 'push_back 'する必要があります。 –

+0

はい、数字が「123」の場合はどうなりますか?それは1、2、3の権利をプッシュしますか? – Grace

+0

ループが始まる前に 'numbers.resize(a)'を置くことがそれを行う一つの方法です。 –

答えて

3

私はあなたがレクサー/トークナイザを書いていると思います。これを行うための

一つの方法は次のとおりです。

#include <string> 
#include <iostream> 
#include <vector> 
std::vector <std::string> getTokens (std::string token){ 

     std::vector<std::string> numbers; 
     std::string temp; 

     //iterators to begin and end of input 
     std::string::const_iterator iter = token.begin(); 
     std::string::const_iterator end = token.end(); 

     //keep looping until we have seen each character 
     while(iter < end){ 
      //if is a digit 
      if(std::isdigit(*iter)){ 
       //loop until the current char is no longer a digit 
       while(std::isdigit(*iter)){ 
        //collect the digit into temp 
        temp+=*iter; 
        //advacnce the iterator 
        ++iter; 
       } 
       //store the resulting string 
       numbers.push_back(temp); 
       //clear temp 
       temp.clear(); 
      } 
      //you could also check for other types of characters with else if(...) cases 
      else{ 
       //discard all non numbers 

      std::cout<<*iter<<" is not a number... discarding!"<<std::endl; 
      ++iter;//make sure to adavnce the iterator 
      } 

     } 
     return numbers; 
} 

int main(int argc, char** argv){ 
    std::string input = "123a123"; 

    std::vector<std::string> out = getTokens(input); 

    for(auto&& x: out){ 
    std::cout<<x<<std::endl; 
    } 

} 

出力:

は数ではありません...捨てます!

LIVE DEMO!

あなたはあなたのコードで問題が発生しますいくつかのことをやっている:

ときnumbersが空であるため、あなたはセグメンテーションフォルトを取得していますat()ここに:

numbers.at(i).push_back(t); 
      //seg fault here 

私が提供したコードの詳細な説明が必要な場合はお知らせください。

0

ありがとうございました!私はついにそれを得た。

for (int i =0; i <a; i++){ 

      t = token[i]; 
      if(isdigit(t)){ 
      string tt; 
      while (isdigit(token[i])){ 
       tt+= token[i];    
       i++;     
      } 
      numbers.push_back(tt); 
     } 

これは数の問題少なくとも

関連する問題