標籤:c語言 類比實現 strstr
strstr和strrstr已經算是字串中相對比較難的了,但是只要我們善於分析,解剖字串,就會化難為易。其實學習代碼的過程中需要我們靜下心來分析,理解。
srtstr函數的功能及用法
原型:char *strstr(const char *dst, const char *src);
#include<string.h>
找出src字串在dst字串中第一次出現的位置(不包括src的串結束符)。返回該位置的指標,如找不到,返回null 指標。
代碼:
#include <stdio.h>#include <string.h>#include <assert.h>char *my_strstr(const char *dst, const char *src){const char *str1 = dst;const char *str2 = src;const char *fast = NULL;assert(dst);assert(src);while (*str1){fast = str1;while (*str1 && *str2 && *str1 == *str2){str1++;str2++;}if (*str2 == ‘\0‘)return (char*)fast;str1 = fast+1;str2 = src;} return NULL;}int main(){char arr1[] = "abcdefgdefk";char arr2[] = "defk";char *ret = my_strstr(arr1,arr2);if (*ret){puts(ret);}return 0;}
解析代碼:
在main函數中定義兩個字串數組,char arr1[]="abcdefgdefk";char arr2[]="defk";在調用函數中用指標來接收,指標接收的優點是指標指向字串的首地址,指標最好用const保護起來,以防被破壞。在調用函數中定義三個指標,char *sr1=dst,char* str2=src,char* fast=NULL(避免野指標),使用之前先斷言指標是否存在,如果str1的內容存在進入迴圈,先將fsat=str1;如果str1指向的內容等於str2指向的內容,str1,str2的地址加加,如果str2的內容等於"\0"了,說明str2字串的內容在str1字串中出現,否則str1指向fast指標指向地址的後一個地址,str2返回到它的首地址,繼續執行迴圈直到str2字串在str1中第一次出現。
類比實現strrstr函數
原型:char *strrstr(const char *str1, const char *str2);
#include<string.h>
找出str2字串在str1字串中最後出現的位置(不包括str2的串結束符)。返回該位置的指標,如找不到,返回null 指標。
#include <stdio.h>#include <string.h>#include <assert.h>char *my_strrstr(const char *dst,const char *src){char *str1=dst;char *str2=src;char *fast=NULL;char *last=NULL;assert(dst);assert(src);while (*str1){fast=str1;while (*str1&&*str2&&*str1==*str2){str1++;str2++;}if (*str2 == ‘\0‘)last=fast;str1=fast+1;str2 = src;}if (*str1 == ‘\0‘)return /*(char *)*/last;/*return NULL;*/}int main(){char *Qwe="asdfghasdgfdfgdfgdfgdfgdfg";char *Zaq="dfg";char *ret=my_strrstr(Qwe,Zaq);puts(ret);return 0;}
本文出自 “Dream” 部落格,請務必保留此出處http://12951882.blog.51cto.com/12941882/1976515
C語言類比實現strstr函數,strrstr 函數