模拟实现C语言–strstr函数
文章目录
- 模拟实现C语言--strstr函数
- 一、strstr函数是什么?
- 二、使用示例
- 三、模拟实现
- 3.1 模拟实现1
一、strstr函数是什么?
在目标字符串中寻找字符串
char * strstr ( const char *str1, const char * str2);
根据语法结构,参数是指针,返回的类型也是指针
如果找到了,就会返回其所在的地址,如果没找到,就会返回NULL
二、使用示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int main()
{
char arr1[] = "abbbbcdef";
char arr2[] = "bbc";
char* ret = strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
三、模拟实现
3.1 模拟实现1
如果直接让str1和str2相互比较,往后寻找的话,当str2不符合条件的时候,那么bbc就要继续从b开始和str1进行比较,但是str2的地址已经改变了,找不到b原来的地址了,所以就需要找两个指针来帮着往后移动
s1代替str1移动,s2代替str2移动,cp的作用是当第一次寻找失败的时候,第二次寻找开始的位置应该是第二个字符的位置,cp就是记录每一次寻找起始位置的指针,cp++就是下一轮寻找的起始位置
寻找最终的停止条件是字符串最后位置的’\0’,一旦出现,就说明其中或者全部的字符串已经寻找完毕了
char * strstr (const char * str1, const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )//如果str2上来就是空字符串的话,那就直接将str1返回
return((char *)str1);
while (*cp)//停止条件就是找到\0了,找到它就相当于找到末尾了
{
s1 = cp;
s2 = (char *) str2;//强制类型转换的目的是为了一个字符一个字符的向后移动
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);