C语言统计相同字符串个数

不知道哪里有逻辑错误,其中s是原始字符串abcabc,s1是要搜索的部分abcintfun(char*s,char*s1){intn=0;char*p=NULL;whil... 不知道哪里有逻辑错误,其中s是原始字符串abcabc,s1是要搜索的部分abc
int fun(char *s,char *s1)
{
int n=0;
char *p=NULL;
while(*s)
{
p=s1;
for(;(*p)&&(*p==*s);s++,p++)
{
if(*p==0)
n++;
}
}
return n;
}
求解决谢谢,给其他算法也行。我觉得我的也差不多了只是有一点错误
int fun(char *s,char *s1)
{
int a=0;
char *p=NULL;
p=s1;
while(*s)
{
p=s1;
for(;(*p)&&(*p==*s);s++,p++);//确认相同
if(*p==0)
{
a++;
}
}
return a;
}
这个有时正确有时错误
展开
 我来答
lgao622
推荐于2016-04-07 · 知道合伙人软件行家
lgao622
知道合伙人软件行家
采纳数:1137 获赞数:6550
毕业于武汉工程大学邮电与信息工程学院通信专业,软件行业,4年工作经验。

向TA提问 私信TA
展开全部

1.可通过 strstr 函数,查找子字符串。找到后即非空,然后加上子字符串偏移,再进行查找没,直到最后返回为空。

2.char *strstr( const char *str1, const char *str2 );

功能:函数返回一个指针,它指向字符串str2 
首次出现于字符串str1中的位置,如果没有找到,返回NULL。

#include <stdio.h>
#include <string.h>

// 从str1中查找str2的个数,并返回
int findChildCnt(char* str1, char* str2)
{
    int len = strlen(str2);
    int cnt = 0;
    while (str1 = strstr(str1, str2)) // 如果查找到,则执行循环,否则为空退出循环
    {
        cnt++; // 统计次数
        str1 += len; // 加上偏移量,即移除str2
    }
    return cnt;
}

int main()
{
    char str1[100], str2[100];
    printf("intput str1 :");
    gets(str1);
    printf("intput str2 :");
    gets(str2);
    printf("Child Cnt: %d\n", findChildCnt(str1, str2));
    return 0;
}

IT孤鹜
推荐于2016-06-11 · TA获得超过4197个赞
知道大有可为答主
回答量:3960
采纳率:71%
帮助的人:3563万
展开全部
while(*s)

 {

  p=s1;

   for(;(*p)&&(*p==*s);s++,p++)

   {

  if(*p==0)

   n++;

   }

    s++ //这里不能忘了 
 }
更多追问追答
追问
为什么要加,不加也行。加了也错
追答
#include<stdio.h>
int fun(char *s,char *s1)
{
  int n=0;
  char *p=NULL;
 while(*s)
 {
  p=s1;
   for(;*p&&(*p==*s);s++,p++);
   
  if(*p=='\0')
  n++;
  if(*s!=*p)
   ++s;
 }
   return n;
}
void main()
{
 char s[]="abceabc,abc",s1[]="abc";
 printf("%d ",fun(s,s1));
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shutupok163
2013-09-21 · TA获得超过187个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:92.8万
展开全部
当p和s递增时,*p==*s只能匹配正好结尾相同的。因为*s字符串中间没有"\0"。改写一个靠谱的吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
汐_枫
2013-09-21 · TA获得超过329个赞
知道小有建树答主
回答量:342
采纳率:0%
帮助的人:265万
展开全部
要判断出现相同字符串没那么简单的,也没那么复杂
注意s的动向就行了
#include<stdio.h>
#include<string.h>
int fun(char *s,char *s1)
{
int a=0,l=strlen(s1);
char *ps,*p1=s1;
while(*s)
{
ps=s;
while(1)
{
if(*p1==*ps)
{
p1++;
ps++;
}
else//出现不相等时,p1返回原来位置s1,s长度缩小
{
p1=s1;
s++;
break;
}
if(*p1==0)
{
a++;
p1=s1;
s+=l;
break;
}
}
}
return a;
}
void main()
{
char s[]="abcabcabcdababcd",s1[]="abcd";//结果是2
printf("%d\n",fun(s,s1));
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
WYQ1bd
2013-09-21 · 超过17用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:44.3万
展开全部
#include<stdio.h>
#include<string.h>
int fun(char *s,char *s1)
{
int n=0;
char *p=NULL;
while(*s)
{
p=s1;
for(;*p&&*p==*s;s++,p++);
if(*p=='\0'){
n++;
s--;
}
s++;
}
return n;
}
void main()
{
char s[]="abcabc",s1[]="abc";
printf("%d\n",fun(s,s1));
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式