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 展开
{
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 展开
2个回答
展开全部
// 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;
}
//
#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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询