1. 程式人生 > 實用技巧 >strstr庫函式模擬實現

strstr庫函式模擬實現

//第一次嘗試:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 1024 const char* myStrstr(const char* str1,const char* str2) { // 由於無法保證呼叫者傳入一個啥樣的引數. 比如極端情況下傳入一個非法地址. // 就需要儘量讓程式碼能比較健壯. // 應該在函式的入口處加上對於引數合法性的校驗 // 所謂的 判空 只是 "聊勝於無" 的操作. 並不能從根本上解決傳入非法引數的問題. if
(str1 == NULL || str2 == NULL) { return NULL; } //建立一個數組,用來儲存源陣列首字元在目標陣列中出現位置的下標 //這樣可以省去一些不必要的判定 char ch = *str2; //printf("%c\n", ch); int arr[MAX] = { 0 }; int flag = 0; int num = strlen(str1); for (int i = 0; i<num; i++) { if (str1[i] == ch) { arr[flag]
= i; flag++; } }arr[flag] = -1; /*int i = 0; for (i = 0; arr[i] != -1; i++) { printf("%d ", arr[i]); }printf("%d\n",arr[i]);*/ //進行比較 for (int i = 0; arr[i] != -1; i++) { int j = arr[i]; char* red = str2; while (str1[j] == *red
&& str1[j] != '\0' && *red != '\0') { j++; red++; } if (*red == '\0') { return str1+arr[i]; } } return NULL; } int main() { char name1[] = "mabaoguobuyaoliannianqingrenbujiangwude"; char name2[] = "buyaolian"; char* ret=myStrstr(name1, name2); for (int i = 0; i<strlen(name2); i++) { printf("%c", ret[i]); }printf("\n"); return 0; }
// 寫這類程式碼的時候,一定要注意:
  // 由於無法保證呼叫者傳入一個啥樣的引數. 比如極端情況下傳入一個非法地址.
  // 就需要儘量讓程式碼能比較健壯.
  // 應該在函式的入口處加上對於引數合法性的校驗