在C ++中将字符串拆分为数组

时间:2011-12-09 16:00:57

标签: c++ string tokenize

  

可能重复:
  How to split a string in C++?

我有一个数据输入文件,每行都是一个条目。在每一行中,每个“字段”由一个空格“”分隔,所以我需要按空格分割线条。其他语言有一个叫做split(C#,PHP等)的函数,但是我找不到一个用于C ++的函数。我怎样才能做到这一点?以下是我的代码:

string line;
ifstream in(file);

while(getline(in, line)){

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

}

7 个答案:

答案 0 :(得分:22)

#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这被认为是一种不好的做法。所以不要这样做:

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

试试strtok。在C ++参考中查找:。

答案 3 :(得分:3)

我已经为我的类似要求写了一个函数, 也许你可以用它!

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

答案 4 :(得分:1)

下面的代码使用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;
}

答案 5 :(得分:0)

C ++最适用于几乎标准的库提升。

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

答案 6 :(得分:0)

使用stringstream或通过ifstream中的令牌读取令牌。

使用stringstream执行此操作:

string line, token;
ifstream in(file);

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