查找字符串s2中给定子串s1的个数,这是子函数,没有所包含的子串时返回-1。我的代码没有输出。
int indexOf(const char *s1,const char *s2){
int i,j,num=0,k=0,flag=1;
if(strlen(s1)>strlen(s2)) return -1;
else
{
for(i=0;i<strlen(s2);++i) //历遍s2数组
{
if(s2[i]==s1[0]) //出现第一个字母与s2首字母相同
{
k=0;
flag=1;
for(j=i+1;j<i+1+strlen(s1);++j)
{
if(s2[j]!=s1[++k]) flag=0; //出现字符与s1不同
}
if(flag) num++;
}
}
if(num==0) return -1;
else return num;
}
}
你的if(s1[i] == s2[0]) 是不是应该改成 if(s2[i] == s1[0])
因为我看你描述的,s1是子串,s2是主串,那这应该是当主串s2中首次出现字串s1中的首个字母时的判定条件吧?
没有返回可能因为第二个for循环里面的flag的用法可能有点不对,flag当s1和s2相应字符不同就为0,所以当字符串s2里面在比较子串s1后有不同于字符串s1的字符就会为0,会导致虽然s2包含了子串s1,但因为flag被设为0而导致仍然返回-1, 不知道有没有理解对你的意思,稍微修改了下你的代码,供你参考一下:
#include <stdio.h>
#include <string.h>
int indexOf(const char *s1,const char *s2){
int i,j,num=0,k=0,flag=1;
int p, wordSameNum=0;
if(strlen(s1)>strlen(s2)) return -1;
else
{
i=0;
for(p=0;p<strlen(s2);p++){
if(s2[p]==s1[i]){ //如果母串s2当前字符和子串s1字符相同,
wordSameNum++; //母串s2和子串s1字符相同的数目加一
i++; //指向子串s1下一个字符
}else{ //如果母串s2当前字符和子串s1字符不同,
if(wordSameNum==strlen(s1)){ //如果母串s2中包含一个子串 s1
num++; //包含子串个数加一
wordSameNum=0; //相同字符数置零
i=0; //指向子串第一个字符重新开始判断s2剩余字符中是否存在子串s1
}
}
}
if(num==0) return -1;
else return num;
}
}
int main(void){
char a[10]="abc";
char b[100]="abc abcdabc abcde ";
int index = indexOf(a,b);
printf("index=%d\n",index);
return 0;
}