当前位置:   article > 正文

C语言字符串函数系列之模拟实现strstr 详细讲解_strstr 头文件

strstr 头文件

目录

前言:

思路:

代码实现:

1 创建变量和函数

 2 找到str1中与str2首元素相同的字符

 3 对比str1和str2的字符,直到str2指向'\0'

完整代码展示:


前言:

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 创建变量和函数

  1. char* my_strstr(const char* str1, const char* str2)
  2. int main()
  3. {
  4. char arr1[10] = { "abccdefg" };
  5. char arr2[10] = { "cde" };
  6. my_strstr(arr1, arr2);
  7. return 0;
  8. }

 2 找到str1中与str2首元素相同的字符

 3 对比str1和str2的字符,直到str2指向'\0'

  1. char* my_strstr(const char* str1, const char* str2)
  2. {
  3. //判断一下str1和str2是否为空指针
  4. assert(str1 && str2);
  5. //只要*str1还没找到\0,就还可以循环
  6. while (*str1)
  7. {
  8. //如果字符相等,两个字符都往后面挪
  9. while (*str1 && *str2 && *str1 == *str2)
  10. {
  11. str1++;
  12. str2++;
  13. //直到第二个字符找到\0
  14. if (*str2 == '\0')
  15. {
  16. return *str1;
  17. }
  18. }
  19. //*str2不等于*str1就只挪*str1
  20. str1++;
  21. }
  22. return NULL;
  23. }

写到这里还没完,这么写就会出现,刚才分析的问题。那要如何解决呢?

增加两个变量,一个存放str1,一个存放str2指向的首元素地址。str1++不会影响p1,str2++也不会影响p2,那么在比较中出现不同的时候,就可以将p2的值赋给str2,再重新比较。

  1. char* my_strstr(const char* str1, const char* str2)
  2. {
  3. assert(str1 && str2);
  4. //为什么要单独放一个p1 p2呢?
  5. //防止出现str1[]="abccdefg" 而str2[]="cde"这种情况
  6. char* p1 = str1;
  7. char* p2 = str2;
  8. //只要p1还没找到\0,就还可以循环
  9. while (*p1)
  10. {
  11. str1 = p1;
  12. str2 = p2;
  13. //如果字符相等,两个字符都往后面挪
  14. while (*str1 && *str2 && *str1 == *str2)
  15. {
  16. str1++;
  17. str2++;
  18. //直到第二个字符找到\0
  19. if (*str2 == '\0')
  20. {
  21. return *str1;
  22. }
  23. }
  24. //*str2不等于*str1就只挪*str1
  25. p1++;
  26. }
  27. return NULL;
  28. }

完整代码展示:

  1. char* my_strstr(const char* str1, const char* str2)
  2. {
  3. assert(str1 && str2);
  4. //为什么要单独放一个p1 p2呢?防止出现str1[]="abccdefg" 而str2[]="cde"这种情况
  5. char* p1 = str1;
  6. char* p2 = str2;
  7. //只要p1还没找到\0,就还可以循环
  8. while (*p1)
  9. {
  10. str1 = p1;
  11. str2 = p2;
  12. //如果字符相等,两个字符都往后面挪
  13. while (*str1 && *str2 && *str1 == *str2)
  14. {
  15. str1++;
  16. str2++;
  17. //直到第二个字符找到\0
  18. if (*str2 == '\0')
  19. {
  20. return *str1;
  21. }
  22. }
  23. //*str2不等于*str1就只挪*str1
  24. p1++;
  25. }
  26. return NULL;
  27. }
  28. int main()
  29. {
  30. char arr1[10] = { "abccdefg" };
  31. char arr2[10] = { "cde" };
  32. my_strstr(arr1, arr2);
  33. return 0;
  34. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/693983
推荐阅读
  

闽ICP备14008679号