查找子串数目,代码没有输出值

查找字符串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;
}