目录
小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化!
1.头文件
strstr函数的使用需要头文件
#include<string.h>
2.strstr函数的使用
简述:strstr函数接收两个字符型地址,用于接收两个字符串,strstr会返回 第二个字符串中第一个字符串第一次出现的地址
注意:返回值是const char*类型
示例如下:
我们看到,strstr函数会在前一个字符串中找后一个字符串,并返回后一个字符串在前一个字符串第一次出现的地址
需要注意:strstr函数在判断字符串是否相等时不包括 '\0',以 '\0' 为停止比较的标志
如果arr2只有'\0',那就会直接返回arr1首元素的地址
3.strstr函数模拟实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strstr(char* arr1, char* arr2) {
char* larr1 = arr1;
char* larr2 = arr2;
if (*arr2 == '\0') {
return arr1;
//如果arr2是空数组,直接返回arr1的首地址
}
/*思路:
* 如果*arr1!=*arr2,arr1与arr2都是首元素地址,不相等那说明起始位置二者之间不存在相同元素,返回地址一定不在这里
* 直接arr1加1,从下一个地址开始比较
*
* 寻找字符串结束时期:寻找结束一定是arr2到 '\0' 了,说明字符串全部找到
*
*/
while (* arr2) {
//arr2没到'\0',寻找没结束
if (*arr1 != *arr2) {
arr1++;
//二者不相等,都加1从下一个位置开始找
}
larr1 = arr1;
//larr1需要赶上arr1的地址,从arr1的地址开始找,arr2不需要变化,arr2始终指向起始位置即可
if (*arr2 == *arr1) {
//二者相等
while (*larr1 == *larr2) {
//用临时变量判断相等,不改变变量值
larr1++;
larr2++;
//相等两者相加
if (*larr2 == '\0') {
//先判断这部,如果larr2是'\0',说明larr2'\0'前一个已经相等,所以larr2已经找到了,直接返回arr1的地址即可
//判断结束,arr2到'\0'了,返回arr1的地址
return arr1;
}
if (*larr1 != *larr2) {
//判断过程中突然出现不相等
arr1++;
//arr1加1,从下个位置再次开始找
larr1 = arr1;
//larr1追赶上arr1位置
larr2 = arr2;
//larr2重赋值
}
}
}
}
}
int main()
{
char arr1[] = { "xxabxxababcxxxx" };
char arr2[] = { "abc" };
char arr3[] = { "xxbcde" };
char*p = my_strstr(arr1, arr2);
printf("%p\n", p);
const char* pp = strstr(arr1, arr2);
printf("%p\n", pp);
}
代码冗长复杂,可以画图分析,如有错误可以指出