string类型find()函数的运用

P1308 统计单词数

string类型find函数的运用与理解。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{	
	string s1,s2;
	cin>>s1;
	getchar();
	getline(cin,s2);
	for(int i=0;i='A'&&s1[i]<='Z')
			s1[i]=s1[i]-'A'+'a';
	for(int i=0;i='A'&&s2[i]<='Z')
			s2[i]=s2[i]-'A'+'a';		
	int cnt=0,fp=-1,p;
	s1=' '+s1+' ';
	s2=' '+s2+' ';
	p=s2.find(s1);  
	while(p!=s2.npos)
	{
		if(fp==-1)
			fp=p;
		cnt++;
		p=s2.find(s1,p+1);
	}	
	if(cnt==0)
		cout<<-1;
	else
		cout<

总结一下

find()

1.find()函数返回字串下标,不存在返回s.npos

值得一提的是实际上find返回是一个string::sizetype类型的变量,不过一般都用int转换该变量,使之成为下标

string a,b;
getline(a);
getline(b);

int p;
p=b.find(a);
if(p==b.npos)
    cout<<"a不是b的字串"<

2.find()可以从指定位置之后查找,可以用于查找第i次出现的子串

int f;
p=b.find(a,f);//从b的下标为f开始查找,即第f+1个字母

不写的时候默认从0开始

统计b中所有a出现的次数

cnt=0;//计数
p=s2.find(s1);  
while(p!=s2.npos)
{
    cnt++;
	p=s2.find(s1,p+1);//每次只往后推一个来找,而不是直接跳到子串结束的位置(p+a.size())
}	                  //可以不漏下子串重叠的情况,比如ababa的字串aba
cout<

rfind()

从后往前查找,b.rfind(a,f)表示从正数第f个字符开始往前找,有些博客写的倒数第f个,幸亏我自己验证了下。

另外还有一个需要注意的点。以下面为例时,当f=5,注意输出的是4,即b字符串中第二个a子串,这个dsf的f并不在前6个字母之中(f=5是下标,第6个字母),所以这个f只针对字串首而不针对字串尾。只要子串头在限定范围内,那就可以找到。

以此类推,当f=8时,子串只有首字母d在限定范围,却已经可以输出8了。

#include 
using namespace std;
int main()
{
	string a="dsf";
	string b="adsfdsfadsf";
	int p=b.rfind(a);
	p=b.rfind(a,5);
	cout<

 

find_first_of()

查找第一个属于b并且属于a的字母。只针对字母了。也是可以设置开始位置的。

string a="dsf";
string b="adsfdsfadsf";
cout<

find_last_of()

从后往前找第一个属于b并且属于a的字母。支持设置开始位置。

find_first_not_of()

查找第一个属于b而不属于a的字母。支持设置开始位置。

find_last_not_of()

从后往前找。

你可能感兴趣的:(string类型find()函数的运用)