以下C++实现一个将字符串拆分以后,存放到一个string当中的代码,使用的时候传入三个参数即可,非常好用:
#ifndef FUNCTIONS_H #define FUNCTIONS_H #include <iostream> #include <string> #include <algorithm> #include <functional> using namespace std; #include <vector> inline string& lTrim(string &ss) { string::iterator p=find_if(ss.begin(),ss.end(),not1(ptr_fun(isspace))); ss.erase(ss.begin(),p); return ss; } inline string& rTrim(string &ss) { string::reverse_iterator p=find_if(ss.rbegin(),ss.rend(),not1(ptr_fun(isspace))); ss.erase(p.base(),ss.end()); return ss; } inline string& trim(string &st) { lTrim(rTrim(st)); return st; } //将一个以par分割的整个字符串,分割以后存到vec里面 void splitStr(vector<string> &vec, string str, string par){ string::size_type pos=0,previousPos=0;//查找到的位置和前一个位置 //处理并没有分割符的情况 if(str.find(par,0)==string::npos){ if(!trim(str).empty()) vec.push_back(trim(str)); return; } string strtmp; for( pos=str.find(par,0); pos!=string::npos; previousPos=pos+par.size(), pos=str.find(par,pos+par.size()) ){ strtmp = str.substr(previousPos,pos-previousPos); if(!trim(strtmp).empty()) vec.push_back(strtmp); } strtmp = str.substr(previousPos,pos-previousPos); if(!trim(strtmp).empty()) vec.push_back(strtmp); } #endif
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
46
47
48
49
50
|
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
using
namespace
std
;
#include <vector>
inline
string
&
lTrim
(
string
&
ss
)
{
string
::
iterator
p
=
find_if
(
ss
.
begin
(
)
,
ss
.
end
(
)
,
not1
(
ptr_fun
(
isspace
)
)
)
;
ss
.
erase
(
ss
.
begin
(
)
,
p
)
;
return
ss
;
}
inline
string
&
rTrim
(
string
&
ss
)
{
string
::
reverse
_iterator
p
=
find_if
(
ss
.
rbegin
(
)
,
ss
.
rend
(
)
,
not1
(
ptr_fun
(
isspace
)
)
)
;
ss
.
erase
(
p
.
base
(
)
,
ss
.
end
(
)
)
;
return
ss
;
}
inline
string
&
trim
(
string
&
st
)
{
lTrim
(
rTrim
(
st
)
)
;
return
st
;
}
//将一个以par分割的整个字符串,分割以后存到vec里面
void
splitStr
(
vector
<
string
>
&
vec
,
string
str
,
string
par
)
{
string
::
size_type
pos
=
0
,
previousPos
=
0
;
//查找到的位置和前一个位置
//处理并没有分割符的情况
if
(
str
.
find
(
par
,
0
)
==
string
::
npos
)
{
if
(
!
trim
(
str
)
.
empty
(
)
)
vec
.
push_back
(
trim
(
str
)
)
;
return
;
}
string
strtmp
;
for
(
pos
=
str
.
find
(
par
,
0
)
;
pos
!=
string
::
npos
;
previousPos
=
pos
+
par
.
size
(
)
,
pos
=
str
.
find
(
par
,
pos
+
par
.
size
(
)
)
)
{
strtmp
=
str
.
substr
(
previousPos
,
pos
-
previousPos
)
;
if
(
!
trim
(
strtmp
)
.
empty
(
)
)
vec
.
push_back
(
strtmp
)
;
}
strtmp
=
str
.
substr
(
previousPos
,
pos
-
previousPos
)
;
if
(
!
trim
(
strtmp
)
.
empty
(
)
)
vec
.
push_back
(
strtmp
)
;
}
#endif
|
本函数可以用以下示例调用:
void main() vector<string> vec; splitStr(vec, "C$D$E$F$G","$"); cout<<"分割前的字符串:"<<str<<endl; cout<<"分割后的子串:"<<endl; for(int i=0; i!=vec.size(); ++i){ cout<<"#"<<vec[i]<<"#"<<endl; } cout<<endl; }
1
2
3
4
5
6
7
8
9
10
|
void
main
(
)
vector
<
string
>
vec
;
splitStr
(
vec
,
"C$D$E$F$G"
,
"$"
)
;
cout
<<
"分割前的字符串:"
<<
str
<<
endl
;
cout
<<
"分割后的子串:"
<<
endl
;
for
(
int
i
=
0
;
i
!=
vec
.
size
(
)
;
++
i
)
{
cout
<<
"#"
<<
vec
[
i
]
<<
"#"
<<
endl
;
}
cout
<<
endl
;
}
|