1.strstr函数
char* strstr(const char* str1, const char* str2);
strstr函数用于判断字符串str2是否为str1的子串,即str1是否包含str2中所有字符。如果str2是str1的子串,则返回str1中str2第一次出现时首元素的地址,如果不是则返回NULL。
2.strstr函数的使用
使用strstr函数前,应包含其头文件(#include)
#include<stdio.h>#include<string.h>intmain() { charstr1[] ="abcdedeaf"; charstr2[] ="dea"; printf("%s\n", strstr(str1, str2)); return0; }
此时strstr函数返回str1中第二个d的地址,printf函数打印的结果为 deaf
3.strstr函数的模拟实现
模拟实现strstr函数的思路为:定义一个cp指针,移动cp指针,将str1中的字符与str2的首字符相比较,如果相同,则继续比较之后的字符是否与str2之后的字符相同;若不同,则继续比较str1中下一个字符是否与str2的首字符相同。
在str1中字符与str2中首字符相同时,若使用cp指针继续比较后面元素,且移动str2指针,若后面元素不相同,即此时str2不为str1子串,(例如:第一个d与str2中首元素相同,但后面的d与a不同,若此时cp指针与str2指针移动,则cp指针无法比较每一个元素,str2指针无法回到首元素的地址处),因此定义两个指针变量 s1 = cp, s2 = str2,当str1中字符与str2中首字符相同时,用s1与s2进行比较,若s1指向的值与s2指向的值不同,则退出循环,cp++,再比较下一个元素是否与str2中首字符相同。
#include<stdio.h>#include<string.h>#include<assert.h>char*my_strstr(constchar*str1, constchar*str2) { //判断str1和str2是否为NULLassert(str1&&str2); char*cp=str1; char*s1=cp; char*s2=str2; //若str2中首元素为'\0',则直接返回str1if (*str2=='\0') { returnstr1; } while (*cp) { //判断str1中元素是否与str2中首元素相同s1=cp;//当cp与str2中首元素相同时,s1向后移动,并与str2中之后元素比较s2=str2;//当cp与str2中首元素相同时,s2向后移动与str1中之后的元素比较while (*s1&&*s2&&*s1==*s2) { s1++; s2++; } if (*s2=='\0') { returncp; } cp++; } returnNULL; }