编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数
。例如,假定输入的字符串为:asd asasdfg asd as zx67 asd mklo,子字符串为:
as,则应输出6。
#include"stdio.h"
#include"string.h"
#include"conio.h"
#define M 80
#define N 10
int fun(char m[M],char n[N])
{int i,j,t,z,cont=0;
char k[N]; \\定义新的数组,用来存放截取的字符串
t=strlen(n);
j=strlen(m);
for(i=0;i<j;i++)
{z=0; \\还原k[]的下标值
{for(i=i;i<i+t&&i+t<j;i++) \\依次截取与N[]等长的一段存放在K[]中
{k[z++]=m[i];
k[z]='\0';}
if(!strcmp(k,n)) \\若K与N相同,则CONT自加1
cont++;}
}
return cont;}
void main()
{char m[M],n[N];
int z;
printf("intput 1:\n");
gets(m);
printf("intput 2:\n");
gets(n);
z=fun(m,n);
printf("cont=%d\n",z); \\当红字部分改为printf("cont=%d\n",fun);时却提示有错误
getch();}
为什么我的程序不能得到想要的效果,到底哪个地方出了问题,请路过的帮忙看下,感谢!!!
现在编程序真郁闷没有一个是不出错的~麻烦大家了~
----------------解决方案--------------------------------------------------------
看KMP去.
不过MS才两个字符的模式串,不用这么麻烦.直接遍历搜索就够了.
----------------解决方案--------------------------------------------------------
何为KMP 何为MS~ 何为遍历搜索~
----------------解决方案--------------------------------------------------------
KMP:快速模式匹配
MS:貌似
遍历搜索:
i=0;
while(str[i+1]!='\0')
{
if(str[i]==t[0]&&str[i+1]==t[1])
{
i+=2;
count++;
}
else
{
i++;
}
}
----------------解决方案--------------------------------------------------------
是我看错题目了~不好意思~
如果要求匹配的长度不为了2而为非固定的数呢~
我就是按这种思路编的程序~还是帮忙看下啊~
----------------解决方案--------------------------------------------------------
那就做匹配吧.
----------------解决方案--------------------------------------------------------
我的思路就是一个串一个串匹配的,可能与你们的匹配方式不同,就是这样才出来问题~
也不晓得问题出在哪了
----------------解决方案--------------------------------------------------------
for(i=0;i<j;i++)
{
z=0;
{
for(i=i;i<i+t&&i+t<j;i++)
{
k[z++]=m[i];
k[z]='\0';
}
if(!strcmp(k,n))
{
count++;
}
}
}
----------------解决方案--------------------------------------------------------
k[z++]=m[i];
k[z]='\0';
这两句我也弄不明白
----------------解决方案--------------------------------------------------------
BF算法中有一个 i-j+1 的叫什么给忘了。。你可以查下
----------------解决方案--------------------------------------------------------