• 详解strstr函数:查找子字符串函数及其模拟实现


    详解strstr函数:在一个字符串中查找另一共字符串是否存在!

    对于strstr查找子字符串,笔者如果不是对C语言学习的更加深入,可能还是不知道有这个函数!!!之前,我们在一个字符串里面查找另外一共字符串都是用指针来遍历整个字符串来查找!!!现在相信各位老铁通过对此博客的学习,等到心有感悟的时候,便能使用该strstr函数来查找了!简单了不少!

    对于 strstr查找子字符串函数的语法有:

    1. //在C++中:const char * strstr ( const char * str1, const char * str2 );
    2. //在C中 : char * strstr ( char * str1, const char * str2 );

    需要注意的是,返回值的类型为:char*类型的指针!!

    显而易见的就是:在字符串str1里面查找是否含有字符串str2!!

     比如:在字符串str1[]="abcdefabcdefabcdef"里面查找是否含有字符串arr2[]="fab"!!!

    如果存在,返回的是子串第一次所在的起始位置!

    如果不存在,返回的是:NULL(空指针)

    但是在str1[]="abcdefabcdefabcdef"含有两次arr2[]="fab",只返回第一次出现的位置!!

    请看代码:

    1. #include <stdio.h>
    2. #include <string.h>
    3. int main()
    4. {
    5. char arr1[] = "abcdefabcdefabcdef";
    6. char arr2[] = "fab";
    7. char* p = strstr(arr1, arr2);
    8. if (p == NULL)
    9. {
    10. printf("不存在\n");
    11. }
    12. else
    13. {
    14. printf("%s\n", p);
    15. }
    16. return 0;
    17. }

    因为 strstr函数的返回值类型为char*类型的指针!!所以需要用char*类型的指针来接收!所以定义了char *p!!当返回值为NULL的时候,打印不存在,否则,打印出来:将p当作起始地址的字符串!!

    代码的运行结果为:

     但是对于返回的是否是第一次出现的位置??想必各位老铁可能心存疑惑!!但是,经过上面的代码的运行结果,想必大家也能解决掉该疑惑了吧!!!

    下面进入最精彩的部分!strstr函数的模拟实现!!也到了压轴的部分了!请睁大眼睛看仔细。

    情况1.

    s1与s2这两个指针不相等,s1++;,当s1与s2这两个指针相等的时候,p此时记录的是s1处的位置,s1++;s2++;各往后走一步,一直到s2走完!!

    情况2:

     

    当s1与s2不相等时,此时p记录的为b的位置,则p从c的位置开始往后找!!

    情况3:

     第一趟走的时候,发现不相等,对于str2,指针重新回到原处,str1++;继续往后找!!

    经过上面的简单分析:我们可以得出下面的代码:

    1. #include <stdio.h>
    2. #include <string.h>
    3. char* my_strstr(const char* str1, const char* str2)
    4. {
    5. const char* s1 = str1;
    6. const char* s2 = str2;
    7. const char* p = str1;
    8. while (*p)
    9. {
    10. s1 = p;
    11. s2 = str2;
    12. while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
    13. {
    14. s1++;
    15. s2++;
    16. }
    17. if (*s2 == '\0')
    18. {
    19. return p;
    20. }
    21. p++;
    22. }
    23. return NULL; //找不到子串
    24. }
    25. int main()
    26. {
    27. char arr1[] = "abcdefabcdef";
    28. char arr2[] = "cde";
    29. char* p = my_strstr(arr1, arr2);
    30. if (p == NULL)
    31. {
    32. printf("不存在\n");
    33. }
    34. else
    35. {
    36. printf("%s\n", p);
    37. }
    38. return 0;
    39. }

    解析:

    1.对于第一个while循环里面:while(*p) 中的*p如果不等于’\0‘就进入!

    2.对于:s1 = p; 认为在p处位置可能匹配成功,讲p赋值给s1,让s1遍历往后走,看看能不能匹配成功!

    3.对于:s2 = str2; 将s2回到起始位置!

    4.对于p++; 当s1与 s2不相等的时候,p++,使得p往后走,跳过刚刚匹配的位置,重新进入while循环,再次进行判断!!

    用上述代码在:abbbcdef里面查找bbc的主要过程:

     解析为:

    将str1与 str2分别指向两个字符串的起始地址!并通过    const char* s1 = str1;    const char* s2 = str2; 也让s1 和s2分别指向两个字符串的起始位置!!指针p也在开始的时候指向str1的位置,让s1 与s2指向的两个位置比较一下,发现不相等,让p往后走(p++),再通过s1=p,将p的位置赋值给s1,s2回到起始位置,将s1 与s2进行比较,相等的话,s1++; s2++; 都往后走,判断又相等,再往后走,发现s1指向b,s2指向c,不相等,则p++;使p往后再走一步,再通过s1=p将s1回到p指向的位置处,通过s2=str2,再将s2回到初始位置,重新进行比较,当两个字符串有一个遇见'\0'时,就会停下来!!

    上面内容就是主要的解析!!请各位老铁仔细品味!!

    最后,此处代码的运行结果为:

     

  • 相关阅读:
    【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
    【Unity3D】实现UI点击事件穿透
    SpringBoot +MyBatis批量插入数据
    SSM整合
    Python实现基于内容的协同过滤推荐算法构建电影推荐系统
    java计算机毕业设计流浪动物救助站系统源码+系统+mysql数据库+lw文档
    Google 开源项目风格指南学习笔记——C++篇
    CSS box-sizing属性到底改变的是什么?
    惨,给Go提的代码被批麻了
    DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(上)
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/127084448