拆分字符串 C++

一、 
split()方法用于将一个字符串分割成字符串数组。 
语法:

stringObject.split(separator,howmany)

 
  • 1
  • 2

参数介绍:separator:必需。字符串或正则表达式,从该参数指定的地方分割stringObject。 
howmany 
可选,该参数指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多余这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

返回值:一个字符串数组,该数组是通过在separator指定的边界处将字符串stringObject分割成子串创建的。返回的数组中的子串不包括separator自身。 
但是如果separator是包含子表达式的正则表达式,那么返回的数组中包括与这些子类表达式匹配的子串(不包括与整个正则表达式匹配的文本)。 
注意:如果把空字符(“”)用来separator,那么stringObject中的每个字符之间都会被分割。 
例如:

string str="hello";
string[] a=str.split("");
for(int i=0;i<a.size();i++)
{cout<<a[i]<<endl;}
 
  • 1
  • 2
  • 3
  • 4

结果: 




o

例1:指定字符分割

string str="123@456";
string[] a=str.split("@");
cout<<a[0]<<", "<<a[1]<<endl;

 
  • 1
  • 2
  • 3
  • 4

输出结果为:123, 456

例2、使用下面的方法可以把句子分割成单词 
var word=sentence.split(’ ‘); 
或者 使用正则表达式作为separator: 
var words=sentence.split(/\s+/);

对于某些特殊字符,如果字符串正好是正则的一部分,那么就需要转义才能使用。 
这些字符有*|,+,,^,$, / , |, [, ], (, ), -, ., **等 
因为他们是正则表达式中的一部分,所以如果想要用该字符本身,这些字符需要进行转移才能表示它本身,

例3、 
想要用|竖线去分割某字符,因为|本身是正则表达式中的一部分,所以需要\去转义,而\正好也是正则表达式中的字符,所以还需要一个\,既需要使用两个。\才可以。

string str="123|abc";
string []b=str.split("\\|");
cout<<b[0]<<","<<b[1]<<endl;
 
  • 1
  • 2
  • 3

输出结果为:123, abc 
例4、如果希望把字符串只返回一部分字符,就使用howmany参数: 
“hello”.split(“”,3) 
结果就返回“h”,”e”,”l”

二、在c++中strtok()用来将字符分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串,当strtok()在参数str的字符串中发现到参数的delimiters的分割字符时会将该字符改为‘\0’字符,在第一次调用时,strtok()必须给予参数str字符串,往后的调用则将参数str设置成NULL. 
函数原型:

char*strtok(char*str,const char *delimiters);

 
  • 1
  • 2

例1、

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main () 
{ 
char str[] ="a,b,c,d*e"; 
const char * split = ","; 
char * p; 
p = strtok (str,split); 
while(p!=NULL) { 
printf ("%s\n",p); 
p = strtok(NULL,split); 
} 
getchar();
return 0;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出: 



d*e

一. _tcstok 函数 

 MFC 中,一个 CString str=“ab ac dd PM” ,怎么把他分开成 ab  ac  dd  PM 这四个字符串,类似 string  split的功能?

_tcstok 声明头文件 : <TCHAR.H>

char * _tcstok ( char * strToken , const char * strDelimit );

该函数是可以从一个 CString 串中,根据提供的分隔符,截取并返回一个一个的 Token 

参数 

strToken: 是一个要分析的串;这个串中包含一个或者多个 Token ,当然还有分隔符,也有可

能有其他的字符;

strDelimit: 是分隔符;根据分隔符把 strToken 中的 Token 分析出来;

//==============test1:_tcstok===============

// 将以空格符为分隔符对str 进行分割

CString str = _T ("192.168.89.125" );

TCHAR seps [] = _T ("." );

TCHAR * token = _tcstok ( (LPTSTR )(LPCTSTR )str , seps );

while ( token != NULL )

{

     printf ("str=%s  token=%s/n" ,str ,token );       

     token = _tcstok NULL , seps );

}

//==============test1:end==================

执行结果如下:

str=192  token=192

str=192  token=168

str=192  token=89

str=192  token=125

第一次调用的时候,函数会忽略出现在 strToken 串开始的分隔符,返回找到的 Token 指针,用空字符( NULL character )替换掉已经查找到的部分(包括分隔符)并把    串保存到一个 Static 变量中(系统来完成);

如果下次调用时第一个参数为 NULL 的话,函数从 Static 变量中取出串,根据分隔符得到并返回新 Token ,用空字符( NULL character )替换掉已经查找到的部分(包括分隔符)并重新保存    串;如此循环,直到循环条件结束。

参考  http://biao3730.spaces.live.com/Blog/cns!3415F543A07A7AE5!175.entry

 可以使用 char *  __cdecl strtok (char *, const char *);( 包含在头文件<string.h> 中)

参考: http://baike.baidu.com/view/1028553.htm

二. AfxExtractSubString 函数 

此外,用 AfxExtractSubString 函数可解析复合串。包含在头文件 < AFXWIN.H > 中。

BOOL AfxExtractSubString (CString & rString , LPCTSTR lpszFullString , int iSubString , TCHAR chSep /* = */ )

参数 

rString :用来存放你取出的子串

lpszFullString :要拆分的整个字符串

iSubString :你要取的子字符串位置,从 0 开始

chSep :特定分割符

//========test2:AfxExtractSubString========

CString str = _T ("192.168.89.125" );

CString output = "" ;

for (int i =0; i <4; i ++)

{

     AfxExtractSubString (output , str , i , '.' );

     printf ("%s/n" ,output );

}

//==============test2:end==================

执行结果如下:

192

168

89

125

参考 : http://www.vckbase.com/bbs/prime/viewprime.asp?id=353

三.自定义函数字符串分割函数 

void Split (CString source , CString divKey, CStringArray & dest )

{

     dest .RemoveAll ();

     int pos = 0;

     int pre_pos = 0;

     while ( -1 != pos ){

         pre_pos = pos ;

         pos = source .Find (division ,(pos +1));

         dest .Add (source .Mid (pre_pos ,(pos -pre_pos )));

     }

}

参数: 

Source :待分割的源串

divKey: 分割符

dest: 分割结果字符串数组



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值