C语言中的strstr函数用来查找子串,找到返回首字符的地址,找不到返回空指针。
使用:
#include
#include
int main()
{
char *p1 = "abcdef";
char *p2 = "def";
//找不到返回一个空指针 找到返回d的位置
char *ret = strstr(p1, p2);
//在p1指向的字符串里查找是否存在p2指向的字符串
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
//ret本身存储的值不是地址 所以无需解引用就可使用
//例如 p1先被赋值为"abcdef" 但p1指针指向"abcdef"中a的地址 所引用以p1无需解引用
}
return 0;
}
模拟实现:
抽象图解:
文章图片
实现代码:
//查找字符串函数strstr
//char* strstr(const char* string, const char* strCharSet);
//NULL - 指的是空指针
//NUL/Null - 指的是'\0'//传过来俩个字符地址 拿字符型指针接收, 由于不会改变原来的字符串 加上const返回的也是地址 所以返回类型为char*
//return 有终止函数的作用
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 != NULL);
//确保p1 ,p2都不能为空指针
assert(p2 != NULL);
char* s1 = NULL;
//后面写了s1 = cur = p1,s2 = p1
char* s2 = NULL;
char* cur = (char*)p1;
if (*p2 == '\0')//若p2是空字符串
{
return (char*)p1;
//强转消除警告
}
while (*cur)//cur先走到\0p2不是p1的子串
{
s1 = cur;
s2 = (char*)p2;
//while((*s1!='\0') && (*s2 !='\0') && (*s1 == *s2)) //俩字符相同s1,s2一起走
while((*s1)&&(*s2)&& !(*s1-*s2))//这个更精简 s1-s2 若s1,s2相同,结果为0, !取反 条件为真
{
s1++;
s2++;
}
if (*s2 == '\0')//找到了 返回匹配成功的位置
{
return cur;
}
if (*s1 == '\0')//若p1的长度小于p2的长度 提前终止
{
return NULL;
}
cur++;
//俩字符不相同s1独自走
}
return NULL;
//找不到子串 返回空指针
}
int main()
{
char *p1 = "abcddefghi";
char *p2 = "def";
//找不到返回一个空指针 找到返回d的位置
char *ret = my_strstr(p1, p2);
//在p1指向的字符串里查找是否存在p2指向的字符串
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
//ret本身存储的值不是地址 所以无需解引用就可使用
//例如 p1先被赋值为"abcdef" 但p1指针指向"abcdef"中a的地址 所引用以p1无需解引用
}
return 0;
}
视频讲解是:
【c语言|(C语言)strstr库函数的简单使用以及模拟实现】C语言从入门到进阶(C语言入门搞定C语言C语言视频教程C语言入门到进阶C语言教程C语言教程C语言教程C语言入门教程C语言入教程C语言C语言视频C语言教程)_哔哩哔哩_bilibili
文章图片
https://www.bilibili.com/video/BV1oi4y1g7CF?p=54
推荐阅读
- c语言|C语言中库函数的模拟实现
- c语言|C语言-字符串库函数详解(含部分函数的模拟实现)
- 网络安全|测试攻击机伪装成目标机 IP 给目标机发送攻击报文是否成功
- 嵌入式|网上五花八门的单片机教程,到底应该怎么整理学习过程
- 嵌入式|单片机有没有想象中那么好学,很迷茫有说正面有说负面
- 数据结构|回顾下接雨水问题
- 栈与队列|19070 音响外放
- 思维|天气预报(牛客)
- 算法|Acwing1230. K倍区间