要模拟实现strstr函数,首先我们应该了解一下strstr函数的定义与功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
那么下面我们来具体说明一下怎么模拟实现strstr函数:首先我们要知道它具体是怎么判断一个字符串是否为另一个字符串的子串,我们的基本思想是:
- 定义两个指针,分别指向子串的第一个字符和母串的第一个字符。然后依次进行比较,如果指针指向位置的字符子串和母串相等,并且子串和母串都没有到结束标识符,那么我们将子串和母串的指针分别+1,指向下一个字符,再进行比较。
- 如果不相等,需要跳出循环,并且让母串的指针+1,指向下一个字符的位置,而子串要指向起始位置,再进行比较。
- 这里我们可以定义两个指针变量来存放子串和母串,让这两个临时指针变化,而子串和母串的指针位置保存下来,这样我们不相等时就可以找到原来子串和母串的位置了。
- 如果保存子串的临时指针变量找到了结束标识符,就说明找到了子串,那么返回母串。如果循环完了都没有找到子串的结束标志符,那么就说明没找到,返回空指针。
- 同时还要考虑到如果子串为空,那么直接返回母串。
- 要注意使用assert断言子串和母串不为空指针,并且我们是要要判断一个字符串是否为另一个字符串的子串,不需要改变字符串所以要用const修饰指针变量,以起到保护作用。
下面是具体实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strstr(const char*str1, const char*str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
if (*str2 == '\0')//如果子串为空,那么直接返回母串
{
return str1;
}
while (*str1 != '\0')//如果母串指针没有指到'\0',即没有到结束标识符,进行循环
{
/*定义两个临时指针变量存放分别存放str1和str2的地址,因为str1和str2的位置要记录下来
临时变量变化不会改变str1和str2的变化*/
const char* s1 = str1;
const char* s2 = str2;
/*当s1、s2没有指向'\0'并且s1、s2所指位置的字符相等时,让s1和s2分别++,即向后面的字符移动*/
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')//如果s2的指针指向了'\0',即指向了字符串结束标志,那么就说明找到了子串,这时返回母串
{
return str1;
}
str1++;//s1、s2没有指向'\0'并且s1、s2所指位置的字符相等时不成立时,将str1向后移动,再次循环比较
}
return NULL;//如果循环完了还没有找到子串,那么返回NULL
}
int main()
{
char *str1 = "abbbbcdefghijk";
char *str2 = "bbc";
char *ret = NULL;
ret = my_strstr(str1, str2);
if (ret != NULL)
{
printf("找到了:%s\n", ret);
}
else
{
printf("没找到\n");
}
system("pause");
return 0;
}