目录
前言
了解strstr函数,模拟实现strstr函数
一、了解strstr函数
原型:extern char *strstr(char *haystack, char *needle);
用法:#include <string.h>
功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。
说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
int main()
{
char arr1[10] = "abcdefg";
char arr2[] = "bcde";
char* ret = strstr(arr1, arr2);
if (ret == NULL) {
printf("没找到!\n");
}
else {
printf("找到了!\n");
}
return 0;
}
二、模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
#include<assert.h>
//模拟实现strstr函数
char* my_strstr(const char* str1,const char* str2) {
assert(str1 && str2);
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;
//如果查询的字符串为空返回str1
if (*str2 == '\0') {
return (char*)str1;
}
while (*cp) {
s1 = cp;//字符串位置回退
s2 = str2;
//防止越界访问
while (*s1 && *s2 && (*s1 == *s2)) {
s1++;
s2++;
}
if (*s2 == '\0') {
return (char*)cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[10] = "abbbcdefg";
char arr2[5] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL) {
printf("没找到!\n");
}
else {
printf("找到了!\n%s",ret);
}
return 0;
}
1.代码解释
我们想要查找第二个字符串是否在第一个字符串里首先就要找到第一个字符串中与第二个字符串首元素相同的地址之后在向后比较str2最后遇到'\0'停止,但是要注意虽然可以在第一个字符串找到与第二个字符串首元素相同的地址,但后面不一定与第二个字符串相同.
例:我们要在字符串"abbbcdefg"查找"bbc",首先我们从第一个字符串找到与第二个字符串首元素相同的地址,就找到了"bbbcdefg",接下来我们就进行一个一个往后比较,但是当比较到c字符时我们发现并不相同,如果在进行这样的比较则会越过一定的字符串从而发生错误,所以我们要进行位置回退,回退到"bbcdefg"在进行比较.
2.拓展延申
在以上代码思路我们是通过一个字符一个字符进行比较,我同时也想出运用strncmp()函数进行比较这样我们就不会涉及到用第三个指针进行回退的问题,strncmp比较时只需比较strlen(str2)个字符即可.但可能出现越界访问的问题.
总结
模拟实现strstr函数,主要是要考虑到指针回退,知道这一点思路就清晰了.