| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2506 人关注过本帖
标题:求子字符串在父字符串中出现的次数
只看楼主 加入收藏
源本云明
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-7-1
结帖率:0
收藏
已结贴  问题点数:10 回复次数:9 
求子字符串在父字符串中出现的次数
自己编制了以下一个小程序,挺简单的,但是自己却被搞糊涂了,所以只能向各位来请教,希望大家给予意见,多多益善
我想要的成功程序是:打印出子字符串在父字符串中出现的次数。如:输入 wo shi zhongguoren!ni ye shi!(父串)  shi(字串),回车后就能输出2!程序的运行结果有错误,我知道下面的一段处理过程中可能错了,
         for(i=0;i<ls;i++)
     {
             if(*(p+i)==q[0])  
          {
              for(t=1;t<lc;t++)
            if(*(p+i+t)==*(q+t))
            ++k;
          }
          }
希望大家能帮我指出来,谢谢!程序的运行结果如附图
1.zip (4.77 KB)
所示。父串为yingmingjun,当我输入字串in时,结果是正确的,但是输入ing时,结果却翻倍了变成4。
完整的源代码如下:
#include "stdio.h"
#include "string.h"
int tongji(char *p,char *q)
{
    int i,k=0,t,ls,lc;
     ls=strlen(p);
     lc=strlen(q);
     for(i=0;i<ls;i++)
     {
          if(*(p+i)==q[0])  
          {
              for(t=1;t<lc;t++)
            if(*(p+i+t)==*(q+t))
            ++k;
          }
     }
    return k;
}
void main()
{
    char str[100],c[100];
    printf("请输入字符串和比较字符:\n");
    gets(str);
    gets(c);
    if(strlen(str)<strlen(c))printf("被比较的字符串长度小于比较字符串!操作无法进行!\n");
    else
    puts("\n");
    printf("父字符串的长度是%d\n",strlen(str));
    printf("\n字符串%s在父字符串中出现的次数为%d\n",c,tongji(str,c));
}
搜索更多相关主题的帖子: 字符 
2010-07-02 14:31
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:5 
for(t=1;t<lc;t++)
if(*(p+i+t)==*(q+t))
 ++k;
这段 改成
int k1=0;
........
for(t=1;t<lc;t++)
if(*(p+i+t)==*(q+t))
 ++k1;
if(k1==lc)
 ++k;
吃鹅吃柳又爱我吧

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-02 15:11
源本云明
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-7-1
收藏
得分:0 
按照各位的指点,解决了子串中出现次数重复的问题。但是我又发现了一个问题,那就是当子串中的首字符和父串中一样时,就会发生比较。如果不一样的时候,次数不加一,但是后面要定位的字符略过了它们(作比较的字符)。
我不防举个例子:父串中输入yingmingjunining 子串中输入ing,正确的结果应该是3,但是结果却是2,最后一个ing没有被计算进去,
原因肯定是读过yingmingjun 后,当读到i时,首字符相等条件成立,所以就将字符往后推,ini不等于ing,所以不成立。
之后,指向了后面的n,而不再指向前面的i,因ng不等于ing,所以这次没有计数进去。产生了这个错误!怎样才能避免这个问题呢?还请大家点一下,谢谢!
运行结果如附图
1.zip (7.75 KB)
,正确的结果应该是4,可运行结果是3。
源代码:
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h"
int tongji(char *p,char *q)
{
    int i,k=0,t,ls,lc,s=0;
     ls=strlen(p);
     lc=strlen(q);
     if(lc==1)
     {
      for(i=0;i<ls;i++)
      if(*(p+i)==q[0])
      ++s;
     }
     else
     for(i=0;i<ls;i++)
     {
         if(*(p+i)==q[0])
          {
                  for(t=1;t<lc;t++)
                if(*(p+i+t)==*(q+t))
                ++k;if(k==lc-1){++s;k=0;}  
          }
     }
    return s;
}
void main()
{
    char str[100],c[100];
    printf("请输入字符串和比较字符:\n");
    gets(str);
    gets(c);
    if(strlen(str)<strlen(c))printf("被比较的字符串长度小于比较字符串!操作无法进行!\n");
    else
    puts("\n");
    printf("父字符串和子字符串的长度分别是%d和%d\n",strlen(str),strlen(c));
    printf("\n字符串%s在父字符串中出现的次数为%d\n",c,tongji(str,c));
}
2010-07-03 14:43
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
for(i=0;i<ls;i++)
     {
         if(*(p+i)==q[0])
          {
                  for(t=1;t<lc;t++)
                if(*(p+i+t)==*(q+t))
                ++k;if(k==lc-1){++s;k=0;}  
          }
        k=0;/*在外层,也要还原K的值*/
     }

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-05 09:13
束缚袭霜
Rank: 2
等 级:论坛游民
帖 子:21
专家分:30
注 册:2010-7-4
收藏
得分:5 
你自己看仔细了,那个K其实统计的对象不对,是字符的符合情况,而且少了第一个字符。
所以判定是否子字符串都比较完了,然后统计量加一就行了。

我是自学的,所以……
2010-07-05 10:34
maylove
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2010-6-7
收藏
得分:0 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int Conter(char *p,char *q)
{
    int i,t,ls,lc;
    int k = 0, j = 0;
     ls=strlen(p); //这个是记录父字符串的长度
     lc=strlen(q);  //这个是记录子字符串的长度
     for(i = 0;i <= ls; i++)
     {
          if(*(p + i) == q[0])
          {
              for(t = 1; t <= lc; t++)
              {
                  if(*(p+i+t) == *(q + t))
                  j++;

                   if(j == lc)
                    {  k++;
                       j = 0;
                     }
              }
          }
     }

    return k;
}

int main()
{
    char str[100],c[100];

    printf("请输入父字符串:\n");
    gets(str);
    printf("请输入子字符串:\n");
    gets(c);

    if(strlen(str)<strlen(c))
        printf("被比较的字符串长度小于比较字符串!操作无法进行!\n");
    else
    puts("\n");

    printf("父字符串的长度是%d\n",strlen(str));
    printf("\n字符串%s在父字符串中出现的次数为%d\n",c,Conter(str,c));

    system("pause");
    return 0;
}
2010-07-17 10:07
maylove
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2010-6-7
收藏
得分:0 
我测试了没有问题。!
2010-07-17 10:07
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
收藏
得分:0 
为什么没人发现这个问题呢??你们在写这句时: if(*(p+i+t) == *(q + t))      
强烈要求写成这样:if((i+t)<=ls&&*(p+i+t) == *(q + t))
我觉得我是应该可以拿到分的。


我也来一段:

#include "stdio.h"
#include "string.h"
int iStr(char *,char *);

int iStr(char *m,char *n)
{  
   int k=0;
   int m1=0,n1;
   int mlen=strlen(m);
   int nlen=strlen(n);
   for(;m1<mlen;m1++)
   {
      if(*(m+m1)==*n)
        {for(n1=1;n1<nlen;n1++)
           if((m1+n1)<=mlen&&*(m+m1+n1)==*(n+n1))
               {if(n1==nlen-1) k++;}     
           else break;


         }
    }
return k;
}


int main()
{
    char str[100],c[100];
    printf("请输入字符串和比较字符:\n");
    gets(str);
    gets(c);
    if(strlen(str)<strlen(c))printf("被比较的字符串长度小于比较字符串!操作无法进行!\n");
    else
    puts("\n");
    printf("父字符串的长度是%d\n",strlen(str));
    printf("子字符串的长度是%d\n",strlen(c));
    printf("\n字符串%s在父字符串中出现的次数为%d\n",c,iStr(str,c));

    getch();
}

[ 本帖最后由 mashrb 于 2010-7-17 14:54 编辑 ]
2010-07-17 14:52
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
收藏
得分:0 
回复 6楼 maylove
你的代码运行会出现问题。你自己查查。
j要设为1才行。
2010-07-17 15:07
weiqiang
Rank: 2
等 级:论坛游民
帖 子:48
专家分:52
注 册:2010-10-18
收藏
得分:0 
学到了很多
2010-10-22 11:48
快速回复:求子字符串在父字符串中出现的次数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034150 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved