常用的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函数。
|