zoukankan      html  css  js  c++  java
  • C语言中的strstr函数

    转自:http://www.cnblogs.com/xy-kidult/archive/2012/12/25/2832460.html

    早上翻《C和指针》,碰见一个子串查找问题,这个问题在C标准库中有模板,即strstr函数,其原型是char*strstr(const char*s1,const char* s2);

      这个函数的作用是在s1中查找子串s2,如果找到,则返回s1中s2的位置。否则返回NULL。

      虽说函数库中存在解决方案,但还是想亲自动手实践一下。于是开始编程,思路很简单,分两步,第一,判断s2是不是空的,或者s2的长度是不是小于s1的长度;第二,在s1中遍历查找与s2第一个字符匹配的字母,如找到,则进行下一个字符匹配。如找不到,则返回空指针。

      结果却都失败了。每次都碰见内存报错问题。仔细检查也没找到错误原因。

      在网上百度了一个答案(见附录),才明白这其实涉及了一个字符匹配算法问题。而我的代码明显想简单了,所以没有成功。字符匹配算法中最常用的是KMP,这个算法说来话长,先挖个坑吧,以后有空再来好好研究它。

    复制代码
     1 #include <stdio.h>
     2 #include<string.h>
     3 
     4 char * strrstr(char const *s1,char const *s2){
     5  char *p2s1=(char*)s1;
     6  char *p2s2=(char*)s2;
     7 
     8 int i,j,m,n,k;
     9 i=k=0;
    10 j=0;
    11 while(i<strlen(s1)&&j<strlen(s2))
    12 {
    13  if(*(p2s1+i)==*(p2s2+j))
    14  {
    15  i++;
    16  j++;
    17  }
    18 else
    19  {
    20  j=0;k++;
    21  i=k;//可用于记录原来i的位置 ;
    22  
    23   
    24  }
    25 }
    26 
    27 if(j>=strlen(s2))//判断找到字符串的条件
    28  {
    29  printf("找到字符串%s",s2);
    30  return (p2s1+i);
    31 } 
    32 else
    33  {
    34      printf("未找到字符串%s
    ",s2); 
    35       return NULL;
    36  }
    37 
    38 
    39 }
    40 int main()
    41 {
    42 char a[]="abcdefghijkl";
    43 char b[]="fgi";
    44 
    45 char* c;
    46 c=strrstr(a,b);
    47 
    48 
    49 return 0;
    50 
    51 
    52 }
    复制代码
  • 相关阅读:
    CentOS7.6下 MariaDB的MHA 集群搭建(一)
    Mariadb10.4 集群压力测试(一)
    Galera 核心参数详解(一)
    Mariadb10.4+ ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
    手动打造一个弹窗程序
    IAT HOOK
    进制的本质
    基于数组越界的缓冲区溢出
    函数调用堆栈图-c语言
    算法之二分查找(上)-c语言实现
  • 原文地址:https://www.cnblogs.com/shirishiqi/p/5421835.html
Copyright © 2011-2022 走看看