字符串分割(C++)

来源:互联网 发布:北航软件学院分数线 编辑:程序博客网 时间:2024/06/07 01:37

经常碰到字符串分割的问题,这里总结下,也方便我以后使用。

一、用strtok函数进行字符串分割

原型: char *strtok(char *str, const char *delim);

功能:分解字符串为一组字符串。

参数说明:str为要分解的字符串,delim为分隔符字符串。

返回值:str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL

示例:

复制代码
 1 //借助strtok实现split
2 #include <string.h>
3 #include <stdio.h>
4
5 int main()
6 {
7 char s[] = "Golden Global View,disk * desk";
8 const char *d = " ,*";
9 char *p;
10 p = strtok(s,d);
11 while(p)
12 {
13 printf("%s\n",p);
14 p=strtok(NULL,d);
15 }
16
17 return 0;
18 }
复制代码

 运行效果: 

strtok 和 strtok_s 都是用于 char 拆分字符串的. 前者 VS 2010 会提示:

'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.(strtok:这个函数或变量可能是不安全的。请考虑使用strtok_s代替)

strtok_s 的例子.
-----------------------------------------------
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1.  char t[] = "a,b,c,de";  
  2. const char *split = ",";  
  3. char *p = NULL, *pNext = NULL;  
  4. p = strtok_s(t,split,&pNext);  
  5. CString R = L"";  
  6. while(p!=NULL){  
  7. R += char_to_cstring(p);  
  8. R += L"\r\n";  
  9. R += L"-----------------";  
  10. R += L"\r\n";  
  11. p = strtok_s(NULL,split,&pNext);  
  12. }  
  13. this->MessageBox(R);  


二、用STL进行字符串的分割 

涉及到string类的两个函数find和substr:
1、find函数
原型:size_t find ( const string& str, size_t pos = 0 ) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:找到的话返回第一次出现的位置,否则返回string::npos 

2、substr函数
原型:string substr ( size_t pos = 0, size_t n = npos ) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos)
返回值:子字符串 

实现如下:

复制代码
 1 //字符串分割函数
2 std::vector<std::string> split(std::string str,std::string pattern)
3 {
4 std::string::size_type pos;
5 std::vector<std::string> result;
6 str+=pattern;//扩展字符串以方便操作
7 int size=str.size();
8
9 for(int i=0; i<size; i++)
10 {
11 pos=str.find(pattern,i);
12 if(pos<size)
13 {
14 std::string s=str.substr(i,pos-i);
15 result.push_back(s);
16 i=pos+pattern.size()-1;
17 }
18 }
19 return result;
20 }
复制代码

完整代码:

复制代码
 1 /*
2 File : split1.cpp
3 Author : Mike
4 E-Mail : Mike_Zhang@live.com
5 */
6 #include <iostream>
7 #include <string>
8 #include <vector>
9
10 //字符串分割函数
11 std::vector<std::string> split(std::string str,std::string pattern)
12 {
13 std::string::size_type pos;
14 std::vector<std::string> result;
15 str+=pattern;//扩展字符串以方便操作
16 int size=str.size();
17
18 for(int i=0; i<size; i++)
19 {
20 pos=str.find(pattern,i);
21 if(pos<size)
22 {
23 std::string s=str.substr(i,pos-i);
24 result.push_back(s);
25 i=pos+pattern.size()-1;
26 }
27 }
28 return result;
29 }
30
31 int main()
32 {
33 std::string str;
34 std::cout<<"Please input str:"<<std::endl;
35 //std::cin>>str;
36 getline(std::cin,str);
37 std::string pattern;
38 std::cout<<"Please input pattern:"<<std::endl;
39 //std::cin>>pattern;
40 getline(std::cin,pattern);//用于获取含空格的字符串
41 std::vector<std::string> result=split(str,pattern);
42 std::cout<<"The result:"<<std::endl;
43 for(int i=0; i<result.size(); i++)
44 {
45 std::cout<<result[i]<<std::endl;
46 }
47
48 std::cin.get();
49 std::cin.get();
50 return 0;
51 }
复制代码

运行效果:

三、用Boost进行字符串的分割

用boost库的正则表达式实现字符串分割
实现如下:

复制代码
 1 std::vector<std::string> split(std::string str,std::string s)
2 {
3 boost::regex reg(s.c_str());
4 std::vector<std::string> vec;
5 boost::sregex_token_iterator it(str.begin(),str.end(),reg,-1);
6 boost::sregex_token_iterator end;
7 while(it!=end)
8 {
9 vec.push_back(*it++);
10 }
11 return vec;
12 }
复制代码

完整代码:

复制代码
 1 //本程序实现的是利用正则表达式对字符串实现分割
2 //运行环境 VC6.0 + boost 库
3 /*
4 File : split2.cpp
5 Author : Mike
6 E-Mail : Mike_Zhang@live.com
7 */
8 #include <iostream>
9 #include <cassert>
10 #include <vector>
11 #include <string>
12 #include "boost/regex.hpp"
13
14 std::vector<std::string> split(std::string str,std::string s)
15 {
16 boost::regex reg(s.c_str());
17 std::vector<std::string> vec;
18 boost::sregex_token_iterator it(str.begin(),str.end(),reg,-1);
19 boost::sregex_token_iterator end;
20 while(it!=end)
21 {
22 vec.push_back(*it++);
23 }
24 return vec;
25 }
26 int main()
27 {
28 std::string str,s;
29 str="sss/ddd/ggg/hh";
30 s="/";
31 std::vector<std::string> vec=split(str,s);
32 for(int i=0,size=vec.size();i<size;i++)
33 {
34 std::cout<<vec[i]<<std::endl;
35 }
36 std::cin.get();
37 std::cin.get();
38 return 0;
39 }
复制代码

运行效果:

补充:

最近发现boost里面有自带的split的函数,如果用boost的话,还是直接用split的好,这里就不多说了,代码如下:

复制代码
#include <iostream>#include <string>#include <vector>#include <boost/algorithm/string/classification.hpp>#include <boost/algorithm/string/split.hpp> using namespace std; int main(){  string s = "sss/ddd,ggg";  vector<string> vStr;  boost::split( vStr, s, boost::is_any_of( ",/" ), boost::token_compress_on );  for( vector<string>::iterator it = vStr.begin(); it != vStr.end(); ++ it )    cout << *it << endl;  return 0;}
复制代码

好,就这些了,希望对你有帮助。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 海岛奇兵资源满了怎么办 海岛奇兵杯越来越多打不玩家怎么办 海岛奇兵控杯技巧 杯数太高怎么办 海岛奇兵发现求救信号怎么办 海岛奇兵被打了怎么办 小鱼翅卡喉咙了怎么办 鱼翅卡在喉咙里怎么办 斗鱼身份证被使用怎么办 做的鱼丸太腥了怎么办 做鱼丸太稀了怎么办 斗鱼手机号换了怎么办 斗鱼直播掉帧怎么办 手机一直卡顿点不动怎么办呢 斗鱼直播分值底怎么办 斗鱼6000鱼丸怎么办卡 斗鱼直播没人看怎么办 淘宝直播间没人气怎么办 挂水了还是有热度怎么办 陌陌工会不结算工资怎么办 滴滴给了差评怎么办 饿了么星级低怎么办 滴滴乘客给低星怎么办 蘑菇街自动收货前还没到怎么办 小主播人气太少别人看不到怎么办 税收分类编码不可用怎么办 斗鱼鱼翅充错了怎么办 苹果指纹摔坏了怎么办 小米5指纹坏了怎么办 苹果5s指纹失灵怎么办 学生赌博输了3万怎么办 电脑录屏没有声音怎么办 别人说你没有他美怎么办 没有你我怎么办歌词是什么意思 要是没有他我怎么办啊歌词 用喀秋莎保存的视频黑屏怎么办 电脑杀毒之后开不了机怎么办 夫妻离婚分房分车怎么办 请的护身符丢了怎么办 老车轻微烧机油怎么办 电脑下软件变卡怎么办 机械表日历偏了怎么办