函数介绍
函数声明
函数声明:char *strstr(const char *str1, const char *str2)
头 文 件:#include <string.h>
返 回 值: 返回值为char * 类型( 返回指向 str1 中第一次出现的 str2 的指针);如果 str2 不是 str1 的一部分,则返回空指针。
官方案例:网址strstr - C++ Reference
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
if (pch != NULL)
strncpy (pch,"sample",6);
puts (str);
return 0;
}
函数实现
1.首先我们要输入两个字符数组,使用gets函数使这个函数变得更加灵活!
2.然后我们要将两个数组的首地址传给形参
3.传给形参之后我们要判断他们不能是空指针,否则就没有意义了
4.由于我们寻找的是b在a中第一次出现的位置(a数组中要完全包含b数组,(b数组要完全的连续的出现在a中))
我们这个时候需要两个指针,起始这两个指针都是指向a(首元素的地址)。
第一个指针(a)是用来判断是否元素和b中元素相等的。
假如这两个这两个字符数组真的有重复的部分,第二个指针(cur)是用来返回 第二个数组与第一个数组重复的起始位置!以便于我们找到打印的起始位置!!
5.当然我们也可以使用固定的字符串来判断。
#include <stdio.h>
#include <string.h>
#include <assert.h>
char * My_strstr(char * a,char *b)
{
assert(a && b);
char* cur = a;//创造一个和a一样的地址
while (*cur)// *cur 如果cur指向'\0' 他在内存中储存的ASCII便为0,便不能进入循环
{
while (*a && *b && (*a == *b))
//只有当*a *b 不等于0 并且两个相等,才能进入循环,这是为了判断两个字符数组是否有相等的部分
{
a++;
b++;
}
if (*b == '\0')
//这时判断*b 是否为 \0 如果为 ,
//则返回他们最开始重复的部分,只有b在a中完全出现,这一步才会运行
{
return cur;
}
//如果没有判断出来,我们将a向后移一位,接着判断!
a++;
cur++;
}
return NULL;
}
int main()
{
char a[50];
gets(a);
char b[50];
gets(b);
//const char* a = "abcdefg";
//const char* b = "cde";
char * ret = My_strstr(a, b);
if (ret == NULL)
{
printf("未找到;>");
}
else
{
printf("%s ", ret);
}
//printf("%s\n",ret);
}
如有错误,欢迎指正!!!
希望各位大佬看完点个赞!