字符串分割(C++)

来源:互联网 发布:nodejs nginx 部署 编辑:程序博客网 时间:2024/06/05 22:39

1.C风格字符串分割

原型: char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。
参数说明:str为要分解的字符串,delim为分隔符字符串。
返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
其它:strtok函数线程不安全,可以使用strtok_r替代。
示例:

//借助strtok实现split#include <string.h>#include <stdio.h>int main(){        char s[] = "Golden Global      View,disk * desk";        const char *d = " ,*";        char *p;        p = strtok(s,d);        while(p)        {                printf("%s\n",p);                p=strtok(NULL,d);        }        return 0;}

其中我有不解的地方:p=strtok(NULL,d);
strtok函数的功能是把一个字符串由指定的分隔符分成更小的字符串。
例如:”this is a demo”用” “(空格)来分隔,就可以得到”this”,”is”,”a”,”demo”四个单词。
strtok的用法:
第一步:初始化
strtok(“this is a demo”,” “);
第二步:得到其它的子字符串
strtok(NULL,” “);
每执行一次第二步就可以得到一个子字符串,直到返回NULL,表示查找结束。

首次调用result = strtok( str, delims );时,内部有个static char *result指针指向了str运行后result指向了now后的“,”之后的循环 result = strtok( NULL, delims ); 可以看成if参数==NULL 仍然使用上次的“,”位置(存在静态变量中)开始继续找,直到找到下一个分隔符“,”。 反复以NULL做参数,找到输出所有的“,”

2.C++类类型字符串分割

涉及到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)
返回值:子字符串

//字符串分割函数std::vector<std::string> split(std::string str,std::string pattern){  std::string::size_type pos;  std::vector<std::string> result;  str+=pattern;//扩展字符串以方便操作  int size=str.size();  for(int i=0; i<size; i++)  {    pos=str.find(pattern,i);    if(pos<size)    {      std::string s=str.substr(i,pos-i);      result.push_back(s);      i=pos+pattern.size()-1;    }  }  return result;}

解释:
1.std::string s=str.substr(i,pos-i)从i开始有pos-i个字符
2. i=pos+pattern.size()-1要从pattern的下一个字符开始,所以+pattern.size(),又-1的原因是循环会i++,所以提前要-1;
3. str+=pattern;//扩展字符串以方便操作,这是为了方便取最后的一段子串,这样不需要对最后一段特殊处理。

0 0