#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main() {
char arr1[20] = "abcdefgabcdefg";
char arr2[20] = "cdef";
int *ret=strstr(arr1, arr2);
if (ret == NULL) {
printf("找不到子串\n");
}
else {
printf("%s\n",ret);
}
return 0;
}
结果为:->cdefgabcdefg
strstr函数的功能就是查找一个字符串是否在另一个字符串当中。
以上这个代码arr2中cdef在arr1这个字符串中所以在目的的字符串中 所以会打印第一次出现这个子串以及后面的字母
模拟实现strstr函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr(const char* str1,const char* str2) { //直接使用const修饰因为不修改它的内容
assert(str1 && str2);//对指针进行断言操作,确保指针的有效性
const char* s1 = str1; //定义一个char*类型的指针指向str1首地址
const char* s2 = str2; //定义一个char*类型的指针指向str2首地址
const char* cur = str1; //定义一个char*类型的指针指向str1首地址
while (*cur) { //当cur不为\0的时候就进入循环
s1 = cur;//寻找的过程中s1和s2都会变化 所以如果没走到最后就把cur的值给到s1 从下一个字符开始寻找
s2 = str2;//把str2的首地址传给s2,让s2从开头寻找
while (*s1 && *s2 && *s1 == *s2) { //当*s1和*s2不为\0并且*s1等于*s2时进入循环
s1++; //让s1和s2++ 判断每个字符是否相等
s2++;
}
if (*s2 == '\0') { //如果走到了最后 也就是*s2为\0时 证明s2中的字符全部与s1的子串相同了(也就是s1中含有或等同s2中的字符了)
return (char*) cur;//直接返回初始的cur的地址
}
cur++;//如果没有走到最后 就认定在cur中找不到,则cur++在下一个字符中寻找
}
return NULL;//找不到
}
int main() {
char arr1[20] = "abcdewgabcdefg";
char arr2[20] = "cdef";
int *ret=my_strstr(arr1, arr2);
if (ret == NULL) {
printf("找不到子串\n");
}
else {
printf("%s\n",ret);
}
return 0;
}