c++查找字符串出现的全部位置

intString::strindex(chart[]){inti,j,ch;i=1;j=1;chars[100];ifstreamifs;ifs.open("fa.tx... int String::strindex(char t[])
{
int i,j,ch;
i=1;
j=1;
char s[100];
ifstream ifs;
ifs.open("fa.txt");
while(!ifs.eof())
{
ifs.getline(s,99);
}

while(i<=strlen(s)&&j<=strlen(t))
{

if(s[i-1]==t[j-1])
{
i++;
j++;
}
else
{
i=i-j+2;
j=1;
}
}

if(j>strlen(t))
{
ch=i-strlen(t);
return ch;
}
else
return 0;

}这是在主串中查找字符串的位置
我这段程序是只可以查找第一次出现的位置,如果我想查找出现的全部位置应该怎么改?即weljl中l的位置应该是3和5,而上面的程序只会出现3
展开
 我来答
高明月月明8612
推荐于2018-03-28 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:65
采纳率:0%
帮助的人:117万
展开全部
// string.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
class String
{
public:
//int strindex(char []);
void String::strindex(char t[],int *ind,int *count);
};

void pos(char S[],char T[],int *ind,int *count);
//int String::strindex(char t[])
void String::strindex(char t[],int *ind,int *count)
{

char s[100];
ifstream ifs;
ifs.open("fa.txt");
while(!ifs.eof())
{
ifs.getline(s,99);
}
ifs.close();
pos(s,t,ind,count);
}

int Index(char s[],char t[],int pos)///关键就是加了pos这个参数
//这是一个普通的朴素模式匹配
//查找并返回模式串t在主串s中从pos开始的位置(下标),
//若t不是s的子串,则返回-1
//pos是下标,从0开始
{
int i,j,ch;
i=pos+1;
j=1;
while(i<=strlen(s)&&j<=strlen(t))
{

if(s[i-1]==t[j-1])
{
i++;
j++;
}
else
{
i=i-j+2;
j=1;
}
}

if(j>strlen(t))
{
ch=i-strlen(t);
return ch;
}
else
return 0;
}

/// 这个函数以上面的为基础扩展一下就行了。
void pos(char S[],char T[],int *ind,int *count)
{
int pos=0,result;
*count=0;
while(strlen(S)>=strlen(T)+pos)
{
result=Index(S,T,pos);
if(result!=0)
{
ind[*count]=result;
(*count)++;
ind[*count]=0;////以零作为结尾标记
pos=result-1;////找到的话,pos指向当前找到的位置,马上pos++让他指下向一个位置
}
pos++;//从下一个开始上再找
}
}

int main(int argc, _TCHAR* argv[])
{
int tt[100];
int c;
char * t="abc";
String str;
str.strindex(t,tt,&c);
for(int i=0;i<c;i++)
{
cout<<tt[i]<<endl;
}
return 0;
}
张未来T6
推荐于2016-03-03 · TA获得超过484个赞
知道小有建树答主
回答量:261
采纳率:100%
帮助的人:50.8万
展开全部
一:最好就是用KMP算法。查找速度快。
二:从s串中查找字符串p,都是从第一个逐个匹配,不匹配则p串重新指向第一个位置,s串位置由第一个向后移动一个位置。注意不是从失配处向后移动,是从第一个位置向后移动一个位置,以后每次失配都向后移动一个位置。匹配则将此位置记下,直到s串查找结束。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式