标题:问问各位大神,为什么输出不了结果?
只看楼主
凌灬轻扬
Rank: 1
等 级:新手上路
威 望:1
帖 子:28
专家分:0
注 册:2016-10-8
得分:0 
回复 2楼 grmmylbs
你说对了,的确是字符串读取错误,改正下,就能实现了。
那我的代码还有什么问题吗?
2016-12-10 13:21
凌灬轻扬
Rank: 1
等 级:新手上路
威 望:1
帖 子:28
专家分:0
注 册:2016-10-8
得分:0 
回复 5楼 九转星河
这个代码是用指针写更好,还是直接用字符数组写要好点?
2016-12-10 16:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用九转星河在2016-12-8 14:37:47的发言:

弄了个……暂时没有发现问题,不过没有经过全覆盖测试,看看效果如何

#include<stdio.h>

int Mystrlen(char *p)
{
    char *pl=p;
    while (*p++!='\0');
    return (p-pl-1);
}
char *fun(char *p1,char *p2)
{
    char *ps=p2;

    while (*p1)
    {
        if (*p1++==*p2)
            *p2++;
        else
            p2=ps;

        if (!*p2)
            return (p1-p2+ps);
    }

    return (p1);
}
int main()
{
    char s1[80],s2[80];
    char *p1,*p2;
    int L1,L2;
    int count=0;

    p1=s1;
    p2=s2;

    gets(s1);
    gets(s2);

    L1=Mystrlen(s1);
    L2=Mystrlen(s2);

    while (*p1)
    {
        p1=fun(p1,p2);

        if (!*p1)
            break;

        count++;
        p1++;
    }

    printf("%d\n",count);

    return 0;
}

Mystrlen()指针用到极致
fun()不太明
尤其这句:
return (p1-p2+ps);
p1与p2不在同一区域,p1-p2 就有不确定性?
2016-12-10 20:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 13楼 吹水佬
其实原型是p1-(p2-ps);p2-ps为p2为子串的长度,因此p2-ps是个定值

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-10 21:15
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用九转星河在2016-12-10 21:15:30的发言:

其实原型是p1-(p2-ps);p2-ps为p2为子串的长度,因此p2-ps是个定值

哦,漏看了,p2与ps是相对的。
试用Sunday算法写一个strstr()
/*
    字符串模式匹配(Sunday算法)
   
    模式串.1234235612356
    子串...1235           从左至右匹对,4与5不匹对。
                          再看4后面的2,从右至左看看2是否在子串中。

           1234235612356  4后面的2是在子串中,将子串中的2对着4后面的2。
           ...1235        再从4开始从左至右匹对,4与1不匹对。
                          看5后面的6,从右至左看看6是否在子串中。
                          5后面的6不在子串中,6后面的1为下次开始匹对的位置。

           1234235612356  6后面的1是在子串中,将子串中的1对着6后面的1。
           ........1235   再从1开始从左至右匹对,匹配上了。
*/

#include<stdio.h>

int _strlen(char *s)
{
    char *p=s;
    while (*p++) NULL;
    return p-s-1;
}

char *_strstr(char *s1, char *s2)
{
    if (!*s1 || !*s2)
        return NULL;
    char *p;
    int len1 = _strlen(s1);
    int len2 = _strlen(s2);
    int chars2[256]= {0};
    int i, j;
    for (i=1; i<=len2; i++)
        chars2[(unsigned char)s2[i-1]] = i; //子串各字符码对应的序号,相同字符取最右边的序号。
    i = 0;
    while (i<=len1-len2)
    {
        j = 0;
        while (j < len2)
        {
            if (s1[i] == s2[j])         //匹对时
            {
                i++;                    //继续下一字符匹对
                j++;
            }
            else                        //不匹对时
            {
                p = s1 + i + len2 - j;                          //看看跟着子串尾的字符
                if (chars2[(unsigned char)*p] == 0)             //如果不在子串中
                    i = p - s1 + 1;                             //下一个字符为下次开始匹对的位置。
                else
                    i = p - (chars2[(unsigned char)*p]-1) - s1; //在子串中时,将其对着模式串的字符,
                                                                //子串第一个字符对应的位置为下次开始匹对的位置。
                break;
            }
        }
        if (j == len2)          //匹配时
            return s1+i-len2;   //返回匹配串首地址
    }
    return NULL;                //没匹配上返回NULL
}

main()
{
    char s1[]="12342356123561235", s2[]="1235", *p;
    int count=0;
    int len=_strlen(s2);
    printf("模式串 %s  子串 %s\n", s1, s2);
    for (p=_strstr(s1,s2); p; p=_strstr(++p,s2))
    {
        count++;
        printf("%.*s %s\n", len, p, p);
    }
    printf("%d个匹配\n", count);
}


[此贴子已经被作者于2016-12-12 06:24编辑过]

2016-12-12 06:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-472110-1-1.html




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

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