目录
strstr函数介绍:
使用strstr:
出现:
未出现:
我的strstr模拟实现:
代码:
代码逻辑:
现在来讲一下比较迷惑的点:
结语:
strstr函数介绍:
在C语言的库函数里面有一个函数叫做strstr(),这个函数的作用是在一个字符串中判断是否存在某一个字符串。
Cplusplus网站上对strstr函数的介绍是这样的:
这段解释提供了几个比较关键的信息:
1.这个函数的返回类型是char*
2.如果在str1里面存在str2那就返回str2中的第一个字符的地址。
3.如果在str1中不存在str2那就返回一个NULL.
4.还有就是实现这个函数的模板。
使用strstr:
出现:
未出现:
我的strstr模拟实现:
代码:
char* my_strstr(const char* str1,const char* str2){
char* s1 = (char*)str1;
char* s2 = (char*)str2;
char* cp = str1;
while (*cp) {
s1 = cp;
s2 = (char*)str2;
while(*s1 && *s2 && *s1 == *s2) {
s1++;
s2++;
}
if (*s2 == '\0') {
return cp;
}
cp++;
}
return NULL;
}
代码逻辑:
1.先定义三个指针变量指向str1,str2,str1。cp指针有标记的作用(标记s1的下一个元素)。
2.进入到循环中,循环条件是*cp不等于’\0'
3.在第一次循环未能成功找出时并且*cp不等于'\0'时,将cp的地址赋值给s1(此时s1指向了下一个元素,以下一个元素为起点进行寻找);s2的地址重新指向str2(字符串str2的首地址)。
4.第二个while循环内的循环条件是s1与s2指向的元素相等且两者指向的元素都不是'\0'。如果这个循环结束那就有三种可能性:
1.s1与s2指向的内容不相等
2.*s1=='\0' 与*s2都等于’\0'
3.*s1与*s2中有一个等于'\0'
5.使用if进行判断,如果在第二个while循环结束以后*s2指向的是'\0'那就是找到了。如果不是那就调整s1指向cp所指向的元素,s2重新指向首元素,再次进行寻找。
6.大循环结束了还没找到的话那就返回NULL.
到这里,我就把我实现my_strstr函数的逻辑讲清楚了。
现在来讲一下比较迷惑的点:
char* my_strstr(const char* str1,const char* str2)
char* s1 = (char*)str1;
char* s2 = (char*)str2;
不知各位看官是否有注意到这里进行了两次强制转换,这里的原因在于str1与str2的前面有一个const修饰符对str1与str2进行限定,所以str1与str2的是比较安全的。当你把char*型的s1与s2指向str1与str2时就相当于用一个没有那么安全的指针指向了一个比较安全的指针,编译器(VS2019)就会报警告,所以为了不报警告我就把str1与str2强制类型转换为char*型。
结语:
好了,今天的分享就到这里了。感谢你的阅读,如果你心情好的话给小牛儿来个三连啊,哈哈哈。