A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

常用的9个字符串C标准库函数之strstr实现
之前介绍了经常用到的9个字符串C标准库函数,这次我们来介绍一下strstr字符串函数的实现。
函数原型:
char* strstr ( const char * str1, const char * str2 );
参数:
    str1:需要从其中查找子串的字符串
    str2:所要查找的子串
返回:
    如果从str1中查找到了str2,则返回str1中第一次出现str2的位置,否则返回NULL.
下面我们来测试一下strstr函数的功能:
//测试程序
#include <stdlib.h>
#include <string.h> //strstr
int main()
{
    char str[] ="itcastithemia";
    char substr[] ="th";//所要查找的子串
    char *p = strstr(str,substr);
    if (p != NULL)
       printf("%s\n",p);
    else
       printf("not found%s\n", substr);
    p = strstr(str,"tha");
    if (p != NULL)
       printf("%s\n",p);
    else
       printf("not found%s\n", substr);
    return 0;
}
根据我们上面对strstr功能的介绍,第一次查找子串”th”,会查找成功,所以strstr函数会返回th首次出现的地址,而第二次要查找的子串“tha”并没i用,所以strstr函数会返回NULL.
测试结果如图:
符合我们的预期。
下面自己实现一个strstr函数,思路如下:
1)从str1的每一个位置开始,依次和str2中的每一个字符进行比较,如果在到str2字符串结尾之前,出现了不等的情况,则结果本轮比较,继续进行下一轮比较,否则查找子串str2成成,返回str1中本轮开始对比的位置。
程序如下:
char *mystrstr(const char *str1, const char *str2)
{
    const char *pstr = str1;
    const char *psub = str2;
    const char *pcur = NULL;
    if (str1 == NULL || str2 ==NULL) //判断参数是否合法
    {
       return NULL;
    }
    while (*pstr != '\0')
    {
       pcur = pstr; //记录每一次从str1中对比字符的起始位置
       psub = str2;
       while (*psub != '\0') //从pcur所标示的位置开始依次与psub中的每一个字符进行比较
       {
           if (*pcur != *psub)//如果出现字符不相等,则结束本次循环指针移动到下一个位置
              break;
           pcur++;
           psub++;
       }
       if (*psub == '\0') //如果到达子串结尾,则说明查找子串成功
           return pstr;
       pstr++; //pstr指向str1中的下一个字符串位置
    }
   
    return NULL;
}
使用自实现的mystrstr运行上面的测试程序,结果如下:
至此,我们成功自实现了一个strstr函数。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马