轉自: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\n",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 }

