C語言實現strstr函數模擬

  • 本文彙總了全網各路大佬的經驗(其實沒幾篇),努力打造最強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真不好用......;
  • 祝德井大爺生日快樂( •̀ ω •́ )✧

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章