C++ string字符串分割
一、find()配合substr()
第一种办法是先通过find()函数查询到子字符串的位置,而后通过substr进行子字符串截取。
关于find()函数共有以下几种:
1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos。(返回值可以看成是一个int型的数),示例如下:
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
find函数返回类型 size_type
string s("1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i");
string flag;
string::size_type position;
//find 函数 返回jk 在s 中的下标位置
position = s.find("jk");
if (position != s.npos) //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
{
printf("position is : %d\n" ,position);
}
else
{
printf("Not found the flag\n");
}
}
2.返回子串出现在母串中的首次出现的位置,和最后一次出现的位置。示例如下:
flag = "c";
position = s.find_first_of(flag);
printf("s.find_first_of(flag) is :%d\n",position);
position = s.find_last_of(flag);
printf("s.find_last_of(flag) is :%d\n",position);
//s.find_first_of(flag) is :5
//s.find_last_of(flag) is : 25
3.查找某一给定位置后的子串的位置,示例如下:
//从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标
position=s.find("b",5);
cout<<"s.find(b,5) is : "<<position<<endl;
//s.find(b,5) is : 23
4.查找所有子串在母串中出现的位置,示例如下:
//查找s 中flag 出现的所有位置。
flag="a";
position=0;
int i=1;
while((position=s.find(flag,position))!=string::npos)
{
cout<<"position "<<i<<" : "<<position<<endl;
position++;
i++;
}
//position 1 : 1
//position 2 : 21
//position 3 : 36
5、反向查找子串在母串中出现的位置,通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。示例如下:
//反向查找,flag 在s 中最后出现的位置
flag="3";
position=s.rfind (flag);
printf("s.rfind (flag) :%d\n",position);
以上内容转载于https://www.cnblogs.com/wkfvawl/p/9429128.html,可获得更多示例。
在获得子字符串位置后,则可通过substr()函数进行子字符串截取,对于string.subsrt(pos, n)函数,包含string中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是string.size() - pos,即不加参数会默认拷贝整个s),若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾,注意这里的n是所要截取的字符串长度,代码如下:
string FileName_Flag = "AVW_00_1_0_00.xml,1";
int posId = FileName_Flag.find(",");
scenarioName = FileName_Flag.substr(0, posId);
scenarioName = scenarioName.substr(0, scenarioName.length() - 4);
//scenarioName = "AVW_00_1_0_00"
这样便可以不断地通过改变substr(pos,length)中的pos和length参数获得字符串中的子字符串。
二、使用strtok()函数
函数原型:char *strtok(char *s,const char *delim) 函数功能:分解字符串为一组字符串,s为要分解的字符串,delim为分隔字符串 描述:strtok()用来将字符串分割成一个个片段,参数s指向将要被分隔的字符串,参数delim则为分隔字符串,当strtok()在参数s的字符串中发现到参数delim的分隔字符时,则会将该字符改为'\0'字符,在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL.每次调用成功则返回被分隔片段的指针。 代码如下:#include<string.h>
#include<stdio.h>
int main(){
char s[] = "a,b*,c,d";
const char *sep = ",*"; //可按多个字符来分割
char *p;
p = strok(s, sep);
while(p){
printf("%s ", p);
p = strtok(NULL, sep);
}
printf("\n");
return 0;
}
//输出: a b c d
关于C++ string的一些函数说明见:https://blog.csdn.net/modiziri/article/details/41748421