首先我们明白strstr的功能是在主字符串str1中查找副字符串str2,如果找到就返回一个char*的地址。
例如在"abcdef"中查找"cde",输出时输出"cdef"
当找不到时会返回一个NULL的指针
那个下面就是代码的实现
我们首先想到的应该是这样的
const char *Mystrstr(const char *str1, const char *str2)
{
while (*str1 != '\0')
{
const char *p = str1;
while (*str1 != '\0' && *str2 != '\0'&&*str1 == *str2)
{
str1++;
str2++;
}
if (*str1 == '\0')
{
return NULL;
}
if (*str2 == '\0')
{
return p;
}
str1++;
}
return NULL;
int main()
{
char dest[50] = "abbcdef";
char *src = "bbc";//这里的字符串存在字符常量区,比写成数组安全性要高
//要保证的是dest要能放的下src
printf("dest:%s src:%s\n", dest, src);
printf("dest:%s\n", Mystrstr(dest, src));
system("pause");
return 0;
}
//然而在实现的过程中,我们发现如果将主字符串改成"abbbcdef"它就会出现错误,如图
因为这样写代码错误之处在于返回值的问题和在检查主字符串的时候没有进行往返的检查,只检查了一次,所以改进后的代码是这样的
const char *Mystrstr(const char *str1, const char *str2)
{
const char *s1 = NULL;
const char *s2 = NULL;
const char *start = str1;
while (*start != '\0')
{
**s1 = start;//s1回退到上一次的下一个位置
s2 = str2;//s2回退到str2的起始位置**
while (*s1 != '\0' && *s2 != '\0'&&*s1 == *s2)
{
s1++;
s2++;
}
if (*s1 == '\0')
{
return NULL;
}
if (*s2 == '\0')
{
return start;
}
start++;
}
return NULL;
}
int main()
{
char dest[50] = "abbbcdef";
char *src = "bbc";//这里的字符串存在字符常量区,比写成数组安全性要高
//要保证的是dest要能放的下src
printf("dest:%s src:%s\n", dest, src);
printf("dest:%s\n",Mystrstr(dest, src));
system("pause");
return 0;
}
重点是用黑体标出来的那两行代码,这样我们就可以找出来想要的字符串了。