2016-10-08 26 views
0

は、データは、このようなものです:C++マルチ分割文字列

0010|chocolate|cookie;458|strawberry|cream;823|peanut|butter;09910|chocolate|icecream 

ので最初のiは、foodの各セクションをsepareする必要があります(とsepared「;」) "chocolate"が含まれているfoodセクションのみのIDを取得すると、データが静的でないため、foodセクションが"chocolate"と表示される回数を予測できないという問題があります。それは作品

#include <string> 
#include <sstream> 
#include <vector> 
#include <iostream> 
#include <fstream> 
using namespace std; 

vector<string> &split(const string &s, char delim, vector<string> &elems) 
{ 
    stringstream ss(s); 
    string item; 
    while (getline(ss, item, delim)) 
    { 
     elems.push_back(item); 
    } 
    return elems; 
} 
vector<string> split(const string &s, char delim) 
{ 
    vector<string> elems; 
    split(s, delim, elems); 
    return elems; 
} 

char* data = "0010|chocolate|cookie;458|strawberry|cream;823|peanut|butter;09910|chocolate|icecream"; 

int main() 
{ 
    vector<string> food = split(data, ';'); 
    cout << number of food sections is : " << food.size(); 

    return 0; 
} 

が、今私はそれがすべてのセクションに読んで、私をリストする:ここで

は私は食品のセクションを分割したデータであるセクションの量を取得するコードですその後、私はおそらく私が使用するのと同じ分割ベクトルで可能であることにchocolateを、含まれているセクションの唯一のIDを一覧表示

0010|chocolate|cookie 
09910|chocolate|icecream 

:どれがのようなその上に「チョコレート」が含まれています。

0010 
09910 
+0

これを行うには正規表現std :: regeexを使用してください – Asesh

答えて

0

データがどれほど豊富であるかによって異なります。最終的には、それに再帰的な降下パーサーを投げなければなりません。しかしこれはもっと簡単です。

セミコロンをエスケープできますか?そうでない場合は、移動し、セミコロンを打つたびに、インデックスを成長するベクトルに格納します。それはあなたに記録開始を与える。その後、レコードをステップ実行します。セミコロンまでのレコードで構成される一時的な文字列を作成し、文字列 "chocolate"を検索します。一致する場合、idはレコードの最初のフィールドなので、最初の|キャラクター。

+0

実際には、私が掲載したコードは、レコードを通過するまでの間、それが問題です。私は 'chocolate 'を見つける方法を理解できませんすべてのレコード。 – 32bitsx86

+0

すべての "レコード"(セミコロンで区切られたレコード)を調べ、各レコードの一時的な文字列を作成し、サブ文字列 "chocoloate"を検索します。それはあなたにすべてを与えます。 –

0

このように、DELIMで区切られた文字列内の単語を見つけるために、機能を使用してみてください:

bool find(string vfood, string s, char delim) 
{ 
    std::istringstream to_find(vfood); 
    for (std::string word; std::getline(to_find, word, delim);) if (word == s) return true; 
    return false; 
} 

そして、あなたは「食品」

の各文字列の中であなたが好きな見つけることができます
vector<string> food_with_chocolate; 

for (string &s : food) 
{ 
    if (find(s, "chocolate", '|')) food_with_chocolate.push_back(s); 
}