C語言模擬實現strstr函數,strrstr 函數
strstr和strrstr已經算是字符串中相對比較難的了,但是只要我們善於分析,解剖字符串,就會化難為易。其實學習代碼的過程中需要我們靜下心來分析,理解。
srtstr函數的功能及用法
原型:char *strstr(const char *dst, const char *src);
#include<string.h>
找出src字符串在dst字符串中第一次出現的位置(不包括src的串結束符)。返回該位置的指針,如找不到,返回空指針。
代碼:
#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的串結束符)。返回該位置的指針,如找不到,返回空指針。
#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 函數