本文实例总结了c的常用字符串分割方法,供大家参考。 具体分析如下:
我们在编程中经常会遇到字符串分割的问题,但是现在总结一下,以后查一下使用也很方便。
一.基于strtok函数的字符串分割
原型: char*strtok(char*str,const char *delim );
功能:将字符串分解为一系列字符串。
参数说明: str是要分解的字符串,delim是分隔符字符串。
返回值:从str开头开始一个接一个分割的字符串。 如果没有拆分的字符串,则返回NULL。
其他: strtok函数线程不安全。 请改为使用strtok_r。
示例:
用strtok实现精灵
#包含
#包含
int main () )
{
char s [ ]=' golden全局视图,磁盘* desk ';
const char *d=',* ';
char *p;
p=strtok(s,d );
是while(p )
{
printf(%s(n ),p );
p=strtok(null,d );
}
返回0;
}
执行效果如下图所示。
二.用STL进行字符串分割
与string类相关的两个函数find和substr :
1、find函数原型: size_tfind(conststringstr,size_t pos=0) const;
功能:查找第一个显示子字符串的位置。
参数说明: str为子字符串,pos为初始搜索位置。
返回值:找到后返回第一个出现的位置,否则返回string:npos
2、substr函数原型: stringsubstr(size_tpos=0,size_t n=npos ) const;
功能:获取子字符串。
参数说明: pos为开始位置(默认值为0 ),n为结束位置(默认值为npos )
返回值:子字符串
实现如下。
//字符串分割函数
STD :3360 vector : stringsplit (STD :3360 stringstr,std:string pattern ) )。
{
STD : string :3360 size _ type pos;
STD :3360 vector : string result;
str=pattern; //扩展字符串以方便操作
int size=str.size (;
for(intI=0; I
{
POS=str.find(Pattern,I );
if )销售点
{
STD :3360 strings=str.substr (I,pos-i );
result.push_back(s;
i=pos pattern.size ()-1;
}
}
返回结果;
}
完整代码:
/*
File : split1.cpp
Author : Mike
E-Mail : Mike_Zhang@live.com
*/
#包含
#包含
#包含
//字符串分割函数
STD :3360 vector : stringsplit (STD :3360 stringstr,std:string pattern ) )。
{
STD : string :3360 size _ type pos;
STD :3360 vector : string result;
str=pattern; //扩展字符串以方便操作
int size=str.size (;
for(intI=0; I
{
POS=str.find(Pattern,I );
if )销售点
{
STD :3360 strings=str.substr (I,pos-i );
result.push_back(s;
i=pos pattern.size ()-1;
}
}
返回结果;
}
int main () )
{
std:string str;
std:cout
//std:cinstr;
栅极线(STD :3360 CIN,str );
std:string pattern;
std:cout
//std:cinpattern;
Getline(STD:CIN,pattern ); 用于获取包含//空格的字符串
STD : vector : string result=split (str,pattern );
std:cout
for(intI=0; I
{
std:cout
}
std:cin.get (;
std:cin.get (;
返回0;
}
执行效果如下图所示。
三.通过提升进行字符串分割
基于boost库正则表达式的字符串分割
实现如下。
STD :3360 vector : stringsplit (STD :3360 stringstr,std:string s ) )。
{
Boost:3360regexreg(s.c_str );
STD : vector : string vec;
boost :3360 s regex _ token _ iterator it (str.begin ),str.end ),reg,-1);
boost :3360 s regex _ token _ iterator end;
wile(it!=end )
{
vec.push_back(*it;
}
返回电压;
}
完整代码:
//本程序实现了使用正则表达式分割字符串
//运行环境VC6.0引导库
/*
File : split2.cpp
Author : Mike
E-Mail : Mike_Zhang@live.com
*/
#包含
#包含
#包含
#包含
#include 'boost/regex.hpp '
STD :3360 vector : stringsplit (STD :3360 stringstr,std:string s ) )。
{
Boost:3360regexreg(s.c_str );
STD : vector : string vec;
boost :3360 s regex _ token _ iterator it (str.begin ),str.end ),reg,-1);
boost :3360 s regex _ token _ iterator end;
wile(it!=end )
{
vec.push_back(*it;
}
返回电压;
}
int main () )
{
STD :字符串str,s;
str='sss/ddd/ggg/hh ';
s='/';
STD : vector : string vec=split (str,s );
for(intI=0,size=vec.size ); I
{
std:cout
}
std:cin.get (;
std:cin.get (;
返回0;
}
执行效果如下图所示。
补充:
最近发现里面有boost附带的split的函数。 如果要使用boost,最好直接使用split。 这里我不多说,代码如下。
#包含
#包含
#包含
#包含
#包含
用户命名空间STD;
int main () )
{
string s='sss/ddd,ggg ';
向量电压VSTr;
boost:3360split(vstr,s,boost:is_any_of (,/),boost : token _ compress _ on );
for (vector :3360 iterator it=vstr.begin ); it!=vStr.end (; it )
cout *it endl;
返回0;
}
在这篇文章中,我希望对大家的c编程有帮助。