查找字符串的所有位置C++

有两个字符串s[]和t[],怎样在s中查找t的所有位置?(要求:用双重循环)
比如s[]="iloveuloveme",t[]="love",返回t的位置2和7,如果不存在,返回-1.
如果考虑空格呢?

求高手帮忙写个详细的代码,我试了几种方法都出不来。会加分的,谢谢!

童鞋呀,这个返回2和7两个位置俺没有学过呀,打印出来倒是可以的,判断不存在也写了

还有你那里应该是1和6呀,位置是从0开始的,你要是一定要2和7的话 在下面+1 就就可以了哦

#include <string.h>
#include <stdio.h>
int FindPos(char* source,char* target)
{
int i,j;
int isExist = -1;
for (i = 0;i<=strlen(source)-strlen(target);i++)
{
if (source[i]==target[0])
{
for (j = 1;j<=strlen(target);j++)
{
if (source[i+j]!=target[j])
break;
}
if (j == strlen(target))
{
isExist = 1;
printf("%d\n",i);
}
j = 0;

}
}
return isExist;
}

void main()
{
char s[]="iloveuloveme",t[]="lsove";
if (-1 == FindPos(s,t))
{
printf("不存在\n");
}
}追问

放到VC++里跑出来的结果很奇怪啊:16116

追答

我在vs2008里面跑了 没问题,
你再试试,碰到问题要多分析
在不懂得385749807

你老是跑别人的程序,光看个结果就过来问,
一点用都没有
下面的为什么只有最后一个你搞明白了再问,
还有我这个,我这里一点问题都没有,
你全新建一个工程,完全拷贝我的代码,我就不信不能用了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-06
// 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;
}
第2个回答  2011-03-23
int FastStrFind(const char * p_sur, char * p_text)
{
char *sp = (char *)p_sur;
char *p = p_text;

int slen = strlen(p_sur);

int plen = strlen(p_text);

if (plen > slen)
{
return -1;
}

while((slen - (sp - p_sur)) >= plen )
{
if (strncmp(p_text,sp, plen) == 0)
{
return (sp - p_sur);
}

int m = plen + 1;

char c = sp[m];

char * q = strchr(p_text, c);
if (q == NULL)
{
sp += m + 1;
}
else
{
int k = q - p_text;
sp += m - k;
}
}

return -1;
}
我以前写的函数,非要双循环,把strncmp函数改成自己写的循环吧追问

我在VC++里试了,这个只能输出第二个love的位置,第一个却没有了呢。。。

第3个回答  2011-03-19
转换成string
string ss(s);
string tt(t);
int pos=ss.find(tt);
pos就是你要找的位置。
相似回答