编写程序,统计子串substr在母串str中出现的次数#include<stdio.h>void main(){char str[80],substr[80];int n;gets(str);gets(substr);printf("%d\n",count(str,substr));}从这开始请高手详细分析一下count(char*str,char*substr){int i,j,k,num=0;for(i=0;str[i];i++)for(j=i,k=0;substr[k]==str[j];k++,j++)if(substr[k+1]=='\0'){num++;break;}return(num);}特别是从第一个for开始到return我需要详细的分析,亲们谢了~
分析一下,首先这个函数不是用的高级的匹配算法KMP(有兴趣可以上网搜下),很直接。从母串的每一位开始,与子串逐位比较。若完全相等则使NUM加1,否则进入下一位继续,直至结束。从代码来看int i,j,k,num=0;for(i=0;str[i];i++) //枚举母串的起始位置。直至str[i]为0,即不存在for(j=i,k=0;substr[k]==str[j];k++,j++) //将for循环用分号分为三部分,则:用j来枚举母串从起始位置开始的每一位,k来枚举子串从0开始的每一位(第一部分),在子串的对应位置与母串相同时运行循环体和第三部分(第二部分),若第二部分的判断成立,则让j,k跳入下一位(第三部分)if(substr[k+1]=='\0')//’\0’是字符串的结尾的后一位,即若位置k的下一位为’\0’,即k为结尾时,意味着从开始到结尾完全相同,此时找到一次,令NUM++。同时跳出循环因为之后’\0’的比较是无意义的,且循环在比较到最后一位时应当结束{num++;break;}return(num); 这段代码的难点在于for循环,通常用于判断结束的第二部分却实际用于比较,而判断结束的部分又放在了循环体中。