子串匹配

  这个还是有点小麻烦的,我自己写的实现效果不太好,代码也很糟,然后查资料看到了比较好的算法,放在这里记录一个。

  C库中有strstr()函数。其原型为:

extern char *strstr(char *str1, const char *str2);

  如果匹配正确,则返回匹配正确的子串的首地址,如果匹配失败返回NULL。

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

int strstr(char * s1, char * s2)  //自定义一个子串匹配的函数
{
    int flag;
    char * p, * q;

    for(; * s1 != '\0'; s1++)
    {
        if (* s2 == * s1)            // 判断字符串中是否有和要判断的字串首字符相同的字符
        {
            flag = 1;
            p = s1;                    // s1 p为第一个相同字符的地址
            q = s2;
            for(; * q != '\0';)        // 如果有则判断接下去的几个字符是否相同
            {
                if (* q++ != * p++)
                {
                    flag = 0;
                    break;
                }
            }
        }
        if (flag == 1)
            break;
    }
    return (flag);
}

int main()
{
    char a[20], b[20], * p = a, * q = b;
    int flag = 1;

    puts("请输入两组字符串进行比较:");
    gets(a);
    gets(b);
    
    puts("匹配结果:");

    if(flag == strstr(strlen(a) < strlen(b) ? q : p, strlen(a) > strlen(b) ? q : p))
        printf("%s 是 %s 的子串\n",strlen(a) < strlen(b) ? a : b, strlen(a) > strlen(b) ? a : b);
    else
        puts("匹配失败!");
    return 0;
}

 

转载于:https://www.cnblogs.com/darkchii/p/7390427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值