web-dev-qa-db-ja.com

C ++で文字列を配列に分割する

可能性のある複製:
C++で文字列を分割する方法?

データの入力ファイルがあり、各行がエントリです。各行で各「フィールド」は空白「」で区切られているため、行をスペースで区切る必要があります。他の言語にはsplitという関数があります(C#、PHP etc))が、C++用の関数を見つけることができません。これはどのようにして実現できますか?これは、行を取得するコードです:

string line;
ifstream in(file);

while(getline(in, line)){

  // Here I would like to split each line and put them into an array

}
13
Ahoura Ghotbi
#include <sstream>  //for std::istringstream
#include <iterator> //for std::istream_iterator
#include <vector>   //for std::vector

while(std::getline(in, line))
{
    std::istringstream ss(line);
    std::istream_iterator<std::string> begin(ss), end;

    //putting all the tokens in the vector
    std::vector<std::string> arrayTokens(begin, end); 

    //arrayTokens is containing all the tokens - use it!
}

ちなみに、std::getlinestd::ifstreamなどの修飾名は、私と同じように使用します。コードのどこかにusing namespace stdを書いたようですが、これは悪い習慣と見なされています。だからそれをしないでください:

22
Nawaz
vector<string> v;
boost::split(v, line, ::isspace);

http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/usage.html#id3115768

4

私は私の同様の要件の関数を記述しました。おそらくそれを使用できます!

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) 
{
    std::stringstream ss(s+' ');
    std::string item;
    while(std::getline(ss, item, delim)) 
    {
        elems.Push_back(item);
    }
    return elems;
}
3
Vijay

strtok を試してください。 C++リファレンスで探してください。

3
LucianMLI

以下のコードはstrtok()を使用して文字列をトークンに分割し、トークンをベクトルに格納します。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;


char one_line_string[] = "hello hi how are you Nice weather we are having ok then bye";
char seps[]   = " ,\t\n";
char *token;



int main()
{
   vector<string> vec_String_Lines;
   token = strtok( one_line_string, seps );

   cout << "Extracting and storing data in a vector..\n\n\n";

   while( token != NULL )
   {
      vec_String_Lines.Push_back(token);
      token = strtok( NULL, seps );
   }
     cout << "Displaying end result in  vector line storage..\n\n";

    for ( int i = 0; i < vec_String_Lines.size(); ++i)
    cout << vec_String_Lines[i] << "\n";
    cout << "\n\n\n";


return 0;
}
1

C++は、ほぼ標準的なライブラリブーストで最適に使用されます。

そして例: http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/usage.html#id3115768

0

stringstream を使用するか、ifstreamからトークンごとに読み取ります。

文字列ストリームでそれを行うには:

string line, token;
ifstream in(file);

while(getline(in, line))
{
    stringstream s(line);
    while (s >> token)
    {
        // save token to your array by value
    }
}
0
jli