- 本文彙總了全網各路大佬的經驗(其實沒幾篇),努力打造最強strstr模擬技術貼(大誤)
- 不說廢話直接看實現思路:
定義兩個指針*p1,*p2指向兩個字符串,開始比較;
若*p1==*p2,則p1++,p2++,兩個指針同時向後移動,比較之後的字符;
若*p1!= *p2,則*p2指回str2的頭,而對於*p1,要指向開始匹配到的字符的下一個字符,這樣纔不會漏掉str1中的字符,這就要定義一個指針(pt)用來記錄開始匹配到的第一個字符的地址;
循環過程中,如果*p2='\0',則成功找到,這時返回pt就可以了;
如果*p1='\0',這種情況下說明p1剩的比p2還少,不可能找到,於是就想到當 strlen(pt)<strlen(p2) 的時候結束循環[即循環條件是strlen(pt)>=strlen(p1)] , 返回NULL,這樣可以避免多餘的不必要的比較;
- code demo(IDE:VS2017)
#include<stdio.h> #include<string.h> char * my_strstr(const char *str1, const char *str2) { char *p1 = (char *)str1; char *p2 = (char *)str2; char *pt = (char *)str1; while (strlen(pt) >= strlen(p2)) { p1 = pt; while ((*p1 == *p2)&&(*p2 != '\0')) { p1++; p2++; } if (*p2 == '\0') return pt; p2 = str2; pt++; } return NULL; } int main() { char a[100]; char b[100]; char *p = NULL; gets(a); gets(b); p = my_strstr(a, b); puts(p); getchar(); return 0; }
- PS:這個方法用到了<string.h>庫,而strstr恰巧就包含在這個庫裏,Emmm,蛇咬住了自己的尾巴?那就再自己寫個strlen函數吧哈哈哈;
- 網上好多人的做法都是以while(*p1)作爲循環條件,這樣雖然可以不用strlen函數,但多了不必要的循環次數;
- 這個csdn的editor真不好用......;
- 祝德井大爺生日快樂( •̀ ω •́ )✧