高手,看看我的问题

kobemadi 2009-02-17 11:11:47
编写一个函数findstr(),该函数统计一个子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值为6
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 81
void ReadWrite();
int findStr(char *str,char *substr)
{
int i,j,k,l,n=0;
l=strlen(substr);
for(i=0;i<81;i++)
for(j=0,k=i;j<l;k++,j++)
if(str[k]==substr[j]&&j==l-1) ++n;
return n;
}

main()
{char str[81],substr[4],ch;
int n,len,i=0;
FILE *rf, *wf ;
rf = fopen("in.dat", "r") ;
wf = fopen("out.dat", "w") ;
while(i<5)
{fgets(str,80,rf);
fgets(substr,10,rf);
len=strlen(substr)-1;
ch=substr[len];
if(ch=='\n'||ch==0x1a) substr[len]=0;
n=findStr(str,substr);
fprintf(wf,"%d\n",n);
i++;
}
fclose(rf) ;
fclose(wf) ;
}


其中函数findStr()是我自己写的.下面是in.dat的内容
asd asasdfg asd as zx67 asd mklo
as
asd asasdfg asd as zx67 asd mklo
asd
asd asasdfg asd as zx67 asd mklo
a
asd asasdfg asd as zx67 asd mklo
s
asd asasdfg asd as zx67 asd mklo
asdz
正确的输出结果out.dat应该是
6
4
6
6
0
但是我这个的结果却是
6
4
6
6
1
实在是有点不甘心啊,为什么到了子字符串是4个长度的时候错了呢?告诉我是哪儿没注意到.
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
old-six-programmer 2009-02-18
  • 打赏
  • 举报
回复
楼主下面这段代码的逻辑有些问题

if( str[k] == substr[j] && j == l - 1 )
++n;


楼主本意是把原字符串与子字符串比较
如果所有字符都对应一致
则匹配数加1

但是楼主却只判断比较过程中只要子字符串最后一个字符对应相等就认为匹配
举一个简单的例子,如果str="abcdefg" substr="kfc"
这种情况满足楼主的逻辑判断,被认为第一次比较就匹配,这显然不对

可以改为如下:

if( str[k] != substr[j] )
break;
else
{
if( j == l - 1 )
n++;
}


当然,楼主还可以去参看一下KMP算法
waizqfor 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 kobemadi 的帖子:]
编写一个函数findstr(),该函数统计一个子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值为6
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 81
void ReadWrite();
int findStr(char *str,char *substr)
{
int i,j,k,l,n=0;
l=strlen(substr);
for(i=0;i <81;i++)
for(j=0,k=i;j <l;k++,j++)

[/Quote]
因为数组太小了 所以才这样的 把substr大一点就好了!~~~
bfhtian 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ltc_mouse 的回复:]
substr[4];
fgets(substr,10,rf)
======================
是不是因为数组substr太小了?
[/Quote]
最后一个子串asdz 应该长度应该是5
feng4206yu 2009-02-18
  • 打赏
  • 举报
回复
的确是2楼所说的问题....
这里要注意一点:

int findStr(char *str,char *substr)
{
int i,j,k,l,n=0;
int L=strlen(str);
l=strlen(substr);
for(i=0;i < L;i++) //感觉这样该稍微好些
for(j=0,k=i;j < l;k++,j++)
if(str[k]==substr[j]&&j==l-1) ++n;
return n;
}
ltc_mouse 2009-02-17
  • 打赏
  • 举报
回复
substr[4];
fgets(substr,10,rf)
======================
是不是因为数组substr太小了?
baihacker 2009-02-17
  • 打赏
  • 举报
回复
int flag = 1;
for(j=0,k=i;j <l;k++,j++)
if(str[k]!=substr[j])
{
flag = 0;
break;
}
n+=flag;

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧