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

总结

    以上即为C++ string字符串分割的一些总结。
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值