目录
前言:
strstr()是一个库函数,头文件为string.h。
其作用是在一个字符串中找另一个字符串,找到了返回第一次出现的首元素地址。没找到就返回空指针。
char * strstr ( const char *, const char * );
strstr()有两个参数,参数1是目标字符串,参数2是源字符串。找到了就返回第一次出现的首元素地址,没找到就返回空指针。
思路:
指针str1指向第一个字符串的首元素,指针str2指向第二个字符串的首元素。当str1 != str2时,只有str1向后移动,而str2保持不动。
当str1和str2所指向的内容相同时,那么str1和str2都要向后移动,知道str2指向‘\0'。
因此
1 创建变量和函数
2 找到str1中与str2首元素相同的字符
3 对比str1和str2的字符,直到str2指向'\0'
但是,操作过程中会发现新的问题,例如:
出现这样的问题,我们应该如何调整我们的思路呢?
这个时候,str2必须要回到'c'的位置,重新与str1进行比较,那么,我们可以增加一个变量,暂时存放"cde"的首元素地址。
代码实现:
1 创建变量和函数
char* my_strstr(const char* str1, const char* str2)
int main()
{
char arr1[10] = { "abccdefg" };
char arr2[10] = { "cde" };
my_strstr(arr1, arr2);
return 0;
}
2 找到str1中与str2首元素相同的字符
3 对比str1和str2的字符,直到str2指向'\0'
char* my_strstr(const char* str1, const char* str2)
{
//判断一下str1和str2是否为空指针
assert(str1 && str2);
//只要*str1还没找到\0,就还可以循环
while (*str1)
{
//如果字符相等,两个字符都往后面挪
while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
//直到第二个字符找到\0
if (*str2 == '\0')
{
return *str1;
}
}
//*str2不等于*str1就只挪*str1
str1++;
}
return NULL;
}
写到这里还没完,这么写就会出现,刚才分析的问题。那要如何解决呢?
增加两个变量,一个存放str1,一个存放str2指向的首元素地址。str1++不会影响p1,str2++也不会影响p2,那么在比较中出现不同的时候,就可以将p2的值赋给str2,再重新比较。
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
//为什么要单独放一个p1 p2呢?
//防止出现str1[]="abccdefg" 而str2[]="cde"这种情况
char* p1 = str1;
char* p2 = str2;
//只要p1还没找到\0,就还可以循环
while (*p1)
{
str1 = p1;
str2 = p2;
//如果字符相等,两个字符都往后面挪
while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
//直到第二个字符找到\0
if (*str2 == '\0')
{
return *str1;
}
}
//*str2不等于*str1就只挪*str1
p1++;
}
return NULL;
}
完整代码展示:
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
//为什么要单独放一个p1 p2呢?防止出现str1[]="abccdefg" 而str2[]="cde"这种情况
char* p1 = str1;
char* p2 = str2;
//只要p1还没找到\0,就还可以循环
while (*p1)
{
str1 = p1;
str2 = p2;
//如果字符相等,两个字符都往后面挪
while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
//直到第二个字符找到\0
if (*str2 == '\0')
{
return *str1;
}
}
//*str2不等于*str1就只挪*str1
p1++;
}
return NULL;
}
int main()
{
char arr1[10] = { "abccdefg" };
char arr2[10] = { "cde" };
my_strstr(arr1, arr2);
return 0;
}