求解一道c语言统计字符串s在字符串str中出现的次数

MythKing 2013-05-02 09:41:34
int findsub(char* src, char* s)
{
char *ptr=src, *p=s; //定义两个指针
char *ptr2=src+strlen(src), *prev=NULL; //ptr2为src的末位置指针
int len=strlen(s), n=0; //子串的长度和计数器
for(;*ptr;ptr++) //循环整个串
{
if(ptr2-ptr<len) //如果一开始子串就大于src,则退出
break;
for(prev=ptr;*prev==*p;prev++,p++) //寻找第一个相等的位置,然后从此位置开始匹配子串
{
if(*(p+1)==0||*(p+1)==10) //如果已经到了子串的末尾
{
n++; //自增
p=s; //重新指向子串
break;//退出
}
}
}
return n;
}



这是为什么通过 if(*(p+1)==0||*(p+1)==10) 这个条件就能够判断到了子串的末尾?

求大神指教
...全文
1920 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
14号选手 2013-05-03
  • 打赏
  • 举报
回复
引用 6 楼 MythKing 的回复:
[quote=引用 4 楼 xuchao1229 的回复:]
for(prev=ptr;*prev==*p;prev++,p++)    //寻找第一个相等的位置,然后从此位置开始匹配子串 
        {
            if(*(p+1)==0||*(p+1)==10)    //如果已经到了子串的末尾 
            {
                n++;    //自增 
                p=s;    //重新指向子串 
                break;//退出 
            }
        }
这个我感觉有点问题啊,当判断之间某一个不匹配的话,不执行循环体,但是位置还是向后移,如果此时字串已经到了最后一个位置,那怎么判断???而为什么不是字串的头指针向后移动????
不匹配就不管它,直到遇上第一个字符串匹配的就进入循环 因为循环条件是*prev==*p,所以必须要他们相等才能一直循环下去 那么如果到了末尾还是循环的话就可以认定字符串s在src中出现一次 之前困惑的是if(*(p+1)==0||*(p+1)==10) 这个条件,不过现在懂了...感谢楼上的两位~[/quote] 不啊,你那个不匹配的话,只是移动到下一个字符,不是整体往后移动,这样势必造成时间的浪费 我写了一个,你可以参考一下
#include <stdio.h>
#include <string.h>
#define M 100
int main(void)
{
    char a[M],b[M],buf[M];
    char *p=NULL,*q=NULL;
    int k=0,m,n;
    gets(a),gets(b);
    m=strlen(a),n=strlen(b);
    for(int i=0;i<m;i++)
    {
        p=strstr(a,b);//获取b的位置等同于存在一个字符串b
        if(p)
        {
            k++;
            q=p+n;//截取字符之后索引应到达的位置
            strcpy(a,q);//将源字符串缩进到比较完毕之后的位置
            a[strlen(a)]='\0';
            q=NULL;//清空索引
            p=NULL;
        }
        else
            break;//搜索不到直接退出
    }
    printf("a got %d b\n",k);
    return 0;
}
MythKing 2013-05-02
  • 打赏
  • 举报
回复
引用 4 楼 xuchao1229 的回复:
for(prev=ptr;*prev==*p;prev++,p++)    //寻找第一个相等的位置,然后从此位置开始匹配子串 
        {
            if(*(p+1)==0||*(p+1)==10)    //如果已经到了子串的末尾 
            {
                n++;    //自增 
                p=s;    //重新指向子串 
                break;//退出 
            }
        }
这个我感觉有点问题啊,当判断之间某一个不匹配的话,不执行循环体,但是位置还是向后移,如果此时字串已经到了最后一个位置,那怎么判断???而为什么不是字串的头指针向后移动????
不匹配就不管它,直到遇上第一个字符串匹配的就进入循环 因为循环条件是*prev==*p,所以必须要他们相等才能一直循环下去 那么如果到了末尾还是循环的话就可以认定字符串s在src中出现一次 之前困惑的是if(*(p+1)==0||*(p+1)==10) 这个条件,不过现在懂了...感谢楼上的两位~
MythKing 2013-05-02
  • 打赏
  • 举报
回复
引用 3 楼 xuchao1229 的回复:
我想知道这一具有啥作用
if(ptr2-ptr<len)    //如果一开始子串就大于src,则退出 
            break;
不是等于目标串的长度吗? 如果是检验子串的话,为什么用目标串的头指针和尾指针相减,而没有字串的事情?
因为ptr2指向的是字符串src末尾字符的位置,而ptr指向的是src开始字符的位置 两项相减就是当前字符串的长度,因为要进行判断,所以ptr的位置是随着判断而移动的 所以也就要在循环中判断
14号选手 2013-05-02
  • 打赏
  • 举报
回复
for(prev=ptr;*prev==*p;prev++,p++)    //寻找第一个相等的位置,然后从此位置开始匹配子串 
        {
            if(*(p+1)==0||*(p+1)==10)    //如果已经到了子串的末尾 
            {
                n++;    //自增 
                p=s;    //重新指向子串 
                break;//退出 
            }
        }
这个我感觉有点问题啊,当判断之间某一个不匹配的话,不执行循环体,但是位置还是向后移,如果此时字串已经到了最后一个位置,那怎么判断???而为什么不是字串的头指针向后移动????
14号选手 2013-05-02
  • 打赏
  • 举报
回复
我想知道这一具有啥作用
if(ptr2-ptr<len)    //如果一开始子串就大于src,则退出 
            break;
不是等于目标串的长度吗? 如果是检验子串的话,为什么用目标串的头指针和尾指针相减,而没有字串的事情?
廖WJ 2013-05-02
  • 打赏
  • 举报
回复
在ASCII码中0代表空格,10代表换行,所以遇到0或者10表示字符串结束。
Carl_CCC 2013-05-02
  • 打赏
  • 举报
回复
这是为什么通过 if(*(p+1)==0||*(p+1)==10) 这个条件就能够判断到了子串的末尾? 一个是结束符 '\0'没得说 一个是回车,换行符,在C里面也是当作结束符号。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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