### strstr是库函数的一种,使用的时候要引头文件#include<string.h>,操作对象是两个字符串。通过代码来具体说明:
int main()
{
char arr1[] = "aaababcdefff";
char arr2[] = "abcdef";
char* ret = strstr(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strstr函数返回类型是char* ,两个参数分别是你想要操作的两个字符串的首元素地址;这个函数把arr1(也就是前面的首元素所在的字符串当作被扫描的对象),后面的arr2代表的数组当作扫描的参照,机制是第一次在arr1数组里面找到完整的arr2数组的时候,从这个扫描成功的初始点(arr1里面的)开始返回这个元素的地址,注意是第一次找到就完成了,即使arr1后面还有匹配的,也不管了;
## 库里面的原理:
## strstr模拟实现:
char* my_strstr(const char* p1, const char* p2)
{
char* s1 = NULL;
char* s2 = NULL;
char* cur = p1;
while (*cur!='\0')
{
s1 = cur;
s2 = p2;
while(*s2!='\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cur;
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "aaaabcdeffff";
char arr2[] = "abcde";
char* ret = my_strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
# 主要看my_strstr里面的内容:首先这里有定义了两个char*型的指针是因为在后面我们模拟比较两个字符串里面对于位置的字符的时候,比较一个就要往后加一,倘若此时就用p1,p2,那么最后就算找到了返回的时候返回的也不是从扫描正确的位置开始返回的地址(p1已经加到后面去了,至于p2则是在每次查找失败之后我们要重新开始的时候可以初始这个开始位置,让它任然指向首元素的地址);cur是方便在对比的时候排除arr1里面的一个就让扫描的初始点指向后面一个这样就可以实现依次查找了,current就是目前的意思,代表目前对比和扫描的起始点(例如上面代码,我们最开始是a和a对应,正确,往后走,a和b不对应,那么就要重新设定扫描的初始点,这时候cur++,就指向arr1里面的第二个a的地址,后面依次如此);
# 之后使用while循环,对比是要反复的,使用循环理所应当,条件是cur!='\0',原因是我们是从cur的指向的地址开始查找的,cur如果指向'\0',那么说明arr1里面的都被扫描了,这时候就找不到了,所以cur!='\0'被设置成循环的条件;
# 进入循环之后将s1初始为cur,准备扫描,cur只是确保能回去并且下一次从下一个元素的地址开始,而s1则是具体实现扫描的对象,s2也是同样功能;
# 往下则是一个while循环,这个循环它的条件成立,我们就要看后面的是否也成立,成立就继续往后面扫描,如果*s1!=*s2,那么就跳出循环,cur++,将扫描初始点加1,继续进行这样的操作,倘若*s2扫描到'\0'了,那么就不进去循环了,if判断成立后返回cur(扫描成功的初始元素的地址,这就对应了strstr的效果)
# 如果扫描完了还没返回cur那么说明arr1里面没有与arr2相同的内容,此时返回NULL。
如若不解,请多多理解代码