strstr函数的参数
strstr函数的功能:
strstr函数是在字符串中找到一个子字符串
找到返回str2在str1中第一次出现的位置。
如果str2在str1中没有出现,就返回NULL。
strstr函数的使用
基于上面strstr函数的参数和功能,编写一段代码:
int main()
{
char arr1[] = "asfeeabcdfgabcdd";
char arr2[] = "abc";
char* ret = strstr(arr1, arr2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到\n");
return 0;
}
代码结果如下:
strstr函数返回的是数组arr2在数组arr1中第一次出现的位置。
strstr函数的模拟实现
char* my_strstr(const char* str1,const char* str2)
{
assert(str1);
assert(str2);
const char* cp = str1;//cp记录可能找到匹配的字符串的起始位置
const char* s1 = NULL;
const char* s2 = NULL;
//如果寻找的字符串是空字符串,直接返回str1
if (*str2 == '\0')
return str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 == *s2 && *s1 && *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "wasfsfsdaf";
char arr2[] = "defq";
char* ret = my_strstr(arr1, arr2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到\n");
return 0;
}
代码讲解:
cp的作用是:记录可能找到匹配的字符串的起始位置
s1的作用是:是遍历数组arr1
s2的作用是:是遍历数组arr2
str1的作用是:接收从主函数传参过来的arr1
str2的作用是:接收从主函数传参过来的arr2
进入主函数,先给数组arr1一串字符用于查找arr2数组中的字符串是否与arr1数组中有相同的字符,然后调用my_strstr函数用于查找,用char *ret
接收形参的返回值。
进入形参,用指针str1,str2分别接收主函数传过来的arr1数组和arr2数组。先断言str1和str2为非空指针,以确保指针str1和str2有效性。然后给cp赋值str1,s1,s2赋值NULL。先判断指针str2是否为空字符串,如果是直接返回str1地址,不是则继续往下执行。进入第一个循环,cp≠'\0'
执行循环,='\0'
跳出循环。在循环中,把cp值赋给s1,str2值赋给s2,若s1=s2,s1、s2 ≠ '\0'
,进入第二个循环,然后s1和s2往后拿取一个字符继续比较。若s2拿取到 '\0'
时,结束第二个循环,然后返回cp地址。若比较到后面字符不相等,第二个循环也会结束,然后cp重新记录可能找到匹配的字符串的起始位置。若cp拿取到'\0'
时候没有匹配的字符则返回空指针。
如图: