在C++中将字符串分割成数组

Split a string into an array in C++

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to split a string in C++?

我有一个数据输入文件,每行都是一个条目。在每一行中,每一个"字段"都由一个空格""分隔开,因此我需要将该行按空格拆分。其他语言有一个叫做拆分的函数(C语言,PHP等),但是我不能为C++找到一个函数。我怎样才能做到这一点?这是我得到行的代码:

1
2
3
4
5
6
7
8
string line;
ifstream in(file);

while(getline(in, line)){

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

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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
2
vector<string> v;
boost::split(v, line, ::isspace);

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


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

1
2
3
4
5
6
7
8
9
10
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;
}

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


下面的代码使用strtok()将字符串拆分为标记,并将标记存储在向量中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include
#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
"
;
char *token;



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

   cout <<"Extracting and storing data in a vector..


"
;

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

"
;

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


"
;


return 0;
}

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

要使用Stringstream执行此操作:

1
2
3
4
5
6
7
8
9
10
11
string line, token;
ifstream in(file);

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


最好使用与几乎标准库Boost的C++。

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