转自: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 }