编写程序,统计子串substr在母串str中出现的次数 需要解答~~

编写程序,统计子串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我需要详细的分析,亲们谢了~
最新回答
纸墨清香

2024-06-06 08:52:15

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