//第一次尝试:
#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; }
// 写这类代码的时候,一定要注意:
  // 由于无法保证调用者传入一个啥样的参数. 比如极端情况下传入一个非法地址.
  // 就需要尽量让代码能比较健壮.
  // 应该在函数的入口处加上对于参数合法性的校验