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

C语言 strstr函数的用法及模拟实现strstr函数「建议收藏」C语言strstr函数的用法及模拟实现strstr函数一、strstr函数的用法二、模拟实现strstr函数的功能一、strstr函数的用法1.strstr函数原型:char*strstr(constchar*str1,constchar*str2)2.功能:strstr()是一个参数为两个字符指针类型,返回值是char*类型的函数,它用于找到子串(str2)在一个字符串(str1)中第一次出现的位置。这里因为传进来的地址指向的内容不会在发生改变,所以我们在两个形参(char*)前加上c

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

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.代码实践

#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.代码实现

#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.net/152991.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图集谷-写真集-爬虫-2.1「建议收藏」

    图集谷-写真集-爬虫-2.1「建议收藏」图集谷爬虫2.0版本的修改版本

    2022年7月27日
    102
  • 手把手教你Python学习!(附流程图)「建议收藏」

    手把手教你Python学习!(附流程图)「建议收藏」关注公众号:Python爬虫数据分析挖掘,免费获取更多开源项目源码对于刚开始接触Python的小伙伴来说,没有思路方法,不知道从何开始学习,把软件环境安装好后就不知所措了!接下来我给大家分享下多位大

    2022年7月1日
    23
  • 视频地址blog加密

    视频地址blog加密/* JS部分 没处理兼容什么的 */   varid='<?phpecho$_GET[‘id’];?>’;   varvideo=document.getElementById(“player”);   window.URL=window.URL||window.webkitURL;   varxhr=newXM…

    2022年5月5日
    49
  • icem合并面网格_ICEM CFD混合网格

    icem合并面网格_ICEM CFD混合网格ICEMCFD中合并多个网格对于结构十分复杂的几何模型,若能够将几何体分割成多个部分由多人分别进行网格划分,生成网格后能够对网格进行组装,这恐怕是很多人梦寐以求的功能了。其实很多前处理软件都具有此功能。今天要说的是如何在ICEMCFD中实现此功能。为了简单起见,这里用一个非常简单的模型进行演示。当然复杂的模型的处理方式也是相同的。我们要处理的几何模型如图1所示。一个L型整体块被切割成3份。分别…

    2022年5月24日
    111
  • linux 下tar打包举例,Linux tar打包命令

    linux 下tar打包举例,Linux tar打包命令Linuxtar打包命令:范例一:将整个/etc目录下的文件全部打包成为/tmp/etc.tar[root@linux~]#tar-cvf/tmp/etc.tar/etc<==仅打包,不压缩![root@linux~]#tar-zcvf/tmp/etc.tar.gz/etc<==打包后,以gzip压缩[root@linux~]#tar-j…

    2022年5月31日
    46
  • 自动阅读 到底 能不能赚钱

    自动阅读 到底 能不能赚钱

    2021年11月11日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号