黑马程序员C/C++培训专家:常用的9个字符串C标准库函数之strstr实现

全国咨询热线:400-618-4000 | 股票代码:839976

黑马程序员C/C++培训专家:常用的9个字符串C标准库函数之strstr实现

更新时间:2017年11月21日14时36分 来源:传智播客

之前介绍了经常用到的9个字符串C标准库函数,这次我们来介绍一下strstr字符串函数的实现。

函数原型:

char * strstr ( const char * str1, const char * str2 );

参数:

str1:需要从其中查找子串的字符串

str2:所要查找的子串

返回:

如果从str1中查找到了str2,则返回str1中第一次出现str2的位置,否则返回NULL.

下面我们来测试一下strstr函数的功能:

//测试程序

#include

#include //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函数。

本文版权归传智播客C/C++学院所有,欢迎转载,转载请注明作者出处。谢谢!

作者:传智播客C/C++学院

首发:http://www.itcast.cn/c/