前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言 strstr函数的用法及模拟实现strstr函数「建议收藏」

C语言 strstr函数的用法及模拟实现strstr函数「建议收藏」

作者头像
全栈程序员站长
发布2022-09-12 18:28:14
3.5K0
发布2022-09-12 18:28:14
举报

大家好,又见面了,我是你们的朋友全栈君。

C语言 strstr函数的用法及模拟实现strstr函数

一、strstr函数的用法

1.strstr函数原型:char* strstr(const char* str1,const char* str2) 2.功能:strstr()是一个参数为两个字符指针类型,返回值是char*类型的函数,它用于找到子串(str2)在一个字符串(str1)中第一次出现的位置。这里因为传进来的地址指向的内容不会在发生改变,所以我们在两个形参(char*)前加上const. 3.包含在string.h头文件中 4.代码实践

代码语言:javascript
复制
#include <stdio.h>
#include<string.h>

int main()
{ 
   
	const char* p1 = "abcdefgh";//"abcdefgh"是常属性字符串,里面的内容无法被改变,在char*前加const
	const char* p2 = "def";
	char* ret = strstr(p1, p2);//把返回的字符串首地址赋给ret
	if (ret == NULL)
	{ 
   
		printf("子串不存在\n");//当返回的字符串首地址为空,ret为一个空指针,代表不存在该子串
	}
	else
	{ 
   
		printf("%s\n", ret);//当返回的字符串首地址不为空,则会从字符串首地址开始打印,到‘\0’停止
	}

	return 0;
}

结果:

在这里插入图片描述
在这里插入图片描述

二、模拟实现strstr函数的功能

1.代码实现

代码语言:javascript
复制
#include <stdio.h>
#include <assert.h>
#include<string.h>
char* my_strstr(const char* p1, const char*p2)//参照strstr函数原型构建自己的strstr函数
{ 
   
	assert(p1 != NULL);//断言该指针不为空指针
	assert(p2 != NULL);
	char*s1 = NULL;//创建一个空指针;
	char*s2 = NULL;
	char*cur = p1;
	if (*p2 == '\0')
	{ 
   
		return (char*)p1;                    //如果我们所要找的子串p2为'\0',返回总串的首元素地址
	}

	while (*cur)//cur代表指向的是子串第一次出现的首元素地址
	{ 
   
		s1 = cur;                      //把cur指向字符串的首元素地址赋给s1
		s2 = (char*)p2;                    //把p2指向的首元素地址赋给s2,每一次循环都要从p2的首元素地址开始重新比较
		while ((*s1 != 0) && (*s2 != 0) && *s1 == *s2)           //只有在s1指向的首元素地址,s2指向的首元素地址都不为'\0'的时候,才可以在总串中找子串的首地址第一次出现的时候
		{ 
                                               // 比较s1,s2指向的地址所对应的字符是否相等,若相等,各自指向的地址向后跳一个字节比较下一位是否相等在满足以上的条件下不断循环,若不满足,
			s1++;                                    //开始一下比较
			s2++;
		}
		if (*s2 == '\0')             //若经过上面的比较,s2指向的内容恰好是'\0',代表找到子串首次出现的地址
		{ 
                                 //若不满足以上情况的比较,开始以下比较
			return (char*)cur;
		}
		if (*s1 == '\0')  
		{ 
   
			return NULL;            //若在s2指向的内容不为'\0'时,s1指向的内容率先为0,代表总串长度比子串长度短,必不存在子串,返回一个空指针
		}
		cur++;//代表当前cur指向的并不是子串第一次出现的首元素地址,指向的地址要往后跳一个字节
	}

	return NULL;//如果经过以上比较都不能得出结果,代表找不到子串,要返回空指针

}

int main()
{ 
   
	const char* arr1 = "abbbcdefg";
	const char* arr2 = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{ 
   
		printf("子串不存在\n");
	}
	else
	{ 
   
		printf("找到了 子串为:%s\n", ret);
	}

	return 0;
}

结果·:

在这里插入图片描述
在这里插入图片描述

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152991.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言 strstr函数的用法及模拟实现strstr函数
  • 一、strstr函数的用法
    • 二、模拟实现strstr函数的功能
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档