. 此题关键就是字符串查找,不过查找之前要先转换成便于查找的形式:
1.大小写转换 2.加空字符
第二步就要用到find函数的使用,创建迭代器,和用于接收find返回值的size_type类型的变量
用于遍历和输出,确定位置和自增之后继续查找后面的出现的字串(因为find函数只能查找并返回第一次出现的位置,要继续查找后面的就要,初始化find函数参数列表,并不断修改参数p为自身返回值,p代表从哪个位置开始查起).
using namespace std;
int main()
{
int count=0,pos=0; //计数、记位
string sm; //主串
string sub; //子串
string::iterator it;//迭代器
string::size_type p=0;//字符串类配套类型,这里的类型和size_t是一样的,可以转换
getline(cin,sub);//读取子字符串
getline(cin,sm); //读取主字符串
for(it=sm.begin();it!=sm.end();it++)//大小写转换
{
if(*it>=65&&*it<=90)*it=*it+32;
}
for(it=sub.begin();it!=sub.end();it++)
{
if(*it>=65&&*it<=90)*it=*it+32;
}
sm=" "+sm+" "; //改变所查询字符串
sub=" "+sub+" ";
while((p=sm.find(sub,p))!=string::npos)//遍历主串查询子串
{
p++;count++;//这里p自增是为了改变起始查找位置,防止重复查找同一个字串
}
pos=sm.find(sub);//这里的pos是int类型的,不过最好用size_type或size_t类型来接收返回值
if(sm.find(sub)==string::npos)printf("-1");
else printf("%d %d",count,pos);
return 0;
}