c/c++语言开发共享C语言模拟实现strstr函数的示例代码

strstr函数介绍c语言提供了字符串匹配函数 strstr 函数,请看文档简介。这个函数是用来匹配 str2 是否包含在 str1 字符串中,如果匹配成功,则返回指向str1中第一个出现的str2的

%ignore_a_1%

strstr函数介绍

c语言提供了字符串匹配函数 strstr 函数,请看文档简介。

C语言模拟实现strstr函数的示例代码

这个函数是用来匹配 str2 是否包含在 str1 字符串中,如果匹配成功,则返回指向str1中第一个出现的str2的指针,如果str2不是str1的一部分,则返回空指针。
我们不妨举例说明,请看下面代码,调用 strstr 函数需要引入string.h头文件,我们发现,s1字符串中可以找到s2字符串,那么就返回s1中s2的第一个字符的地址,s1字符串并没有s3,所以返回空指针。

#include<stdio.h>  #include<string.h>    int main(){        char* s1 = "abcdefgh";      char* s2 = "def";      char* s3 = "dee";            printf("%sn",strstr(s1,s2)); //defgh         printf("%sn",strstr(s1,s3)); //(null)        return 0;  }  

bf算法介绍

bf算法,即暴力(brute force)算法,bf算法的思想就是str1的第一个字符与str2的第一个字符进行匹配,若相等,则继续比较str1的第二个字符和 str2的第二个字符;若不相等,则比较str1的第二个字符和str2的第一个字符,依次比较下去,直到得出最后的匹配结果。

bf算法模拟实现strstr函数

用bf算法实现 strstr 函数的思路就是遍历整个 str1,在内层循环进行判断,如果str1 和 str2 对应的字符相等且比较的字符在 str2 长度范围之内, 那么就比较下一位,当这次循环结束,此时只有两种情况,第一种是比较的字符等于 str2 的长度,那么就代表找到了,返回 str2 在 str1 第一个字符地址即可,至于为什么是 str1 + i – j,请朋友们思考一下就明白了。第二种情况是某个字符之间不匹配,那么 str1 下次匹配的位置为前一个字符位置 + 1,str2 又回到第一个字符开始匹配。直到整个 str1 超出了匹配的范围,代表找不到整个字符串 str2,故返回null。

char* my_strstr(char* str1, char* str2){      assert(str1 && str2);            int slen = strlen(str1);      int sublen = strlen(str2);            int i = 0;      int j = 0;      int count = 0;        while(i < slen){                    while(str1[i] == str2[j] &&  j < sublen){              ++i;              ++j;          }            if(j >= sublen){              return str1 + i - j;          }                    ++count;          i = count;          j = 0;                }                return null;    }  

kmp算法介绍

kmp算法是一种改进的字符串匹配算法,由d.e.knuth,j.h.morris和v.r.pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称kmp算法)。kmp算法的核心是利用匹配失败后的信息,尽量减少模式串(str2)与主串(str1)的匹配次数以达到快速匹配的目的。具体实现就是通过一个next数组实现,数组本身包含了模式串的局部匹配信息。

kmp算法与bf算法的区别是:主串不会回退,模式串每次也不一定回退到第一个位置上。

具体算法思想可参考:kmp算法讲解

kmp算法模拟实现strstr函数

#include<stdio.h>  #include<string.h>  #include<assert.h>  #include<stdlib.h>    void get_next(int* next, char* sub){      int len = strlen(sub);      next[0] = -1;      next[1] = 0;        int i = 2;      int k = 0;        while(i < len){          if(k == -1 || sub[i-1] == sub[k]){              next[i] = ++k;              ++i;          }else{              k = next[k];          }      }                    }    char* my_strstr(char *str1, char * str2){      assert(str1 && str2);            int slen = strlen(str1);      int sublen = strlen(str2);        int* next = (int*)malloc(sizeof(int)*sublen);      assert(next);      get_next(next,str2);        int i = 0;      int j = 0;        while(i < slen && j < sublen){          if(j == -1 || str1[i] == str2[j]){              ++i;              ++j;          }else{              j = next[j];          }      }        if(i >= sublen){          return str1 + i - j;      }else{          return null;      }        }  

到此这篇关于c语言模拟实现strstr函数的示例代码的文章就介绍到这了,更多相关c语言 strstr函数内容请搜索<计算机技术网>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网>!

需要了解更多c/c++开发分享C语言模拟实现strstr函数的示例代码,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/1120942.html

(0)
上一篇 2022年7月13日
下一篇 2022年7月13日

精彩推荐