分析一下,首先这个函数不是用的高级的匹配算法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循环,通常用于判断结束的第二部分却实际用于比较,而判断结束的部分又放在了循环体中。