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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决哈希冲突(四种方法)[通俗易懂]

    解决哈希冲突(四种方法)[通俗易懂]一、了解哈希表及哈希冲突哈希表:是一种实现关联数组抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值。哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。二、解决哈希冲突办法1、开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址。举例:就是当我们去教室上课..

    2022年6月17日
    28
  • 线段树详解 (原理,实现与应用)「建议收藏」

    线段树详解By岩之痕一:综述线段树是一种可以快速进行区间修改和区间查询的数据结构。点修改,区间修改和区间查询的复杂度都是O(log2(n))并且,线段树可以维护很多种类的信息。说到线段树就不得不提一下树状数组,树状数组维护的信息必须满足区间减法,因为树状数组只是维护1到X的信息,通过相减来得到区间信息,代码简单而且速度快,占用空间又少于线段树,所以一般情况下可以用树状数组的地方就

    2022年4月5日
    56
  • 艺术概论[通俗易懂]

    目录一.艺术的本质与特征艺术本质1.客观精神说2.主观精神说3.模仿说/再现说艺术的特征二.艺术的起源中外艺术史上关于艺术起源的五种观点艺术起源的第六种看法:多元决定论三.艺术的功能与艺术教育艺术的社会功能艺术教育四.文化系统中的艺术作为文化现象的艺术艺术与哲学艺术与宗教艺术与道德艺术与科学五.实用艺术实用艺术的主要种类实用艺术的审美特征中外实用艺术精品赏析六.造型艺术造型艺术的主要种类造型艺术的审美特征中外造型艺术精品赏析七.表情艺术表情艺术的主要种类表情艺术的审美特征中外表情艺术的精品赏析八.综合

    2022年4月17日
    49
  • 贴片电阻功率与尺寸对照表文库_贴片电阻功率怎么看

    贴片电阻功率与尺寸对照表文库_贴片电阻功率怎么看电阻封装尺寸与功率关系,通常来说:02011/20W 04021/16W 06031/10W 08051/8W 12061/4W电容电阻外形尺寸与封装的对应关系是:0402=1.0×0.51/16W 0603=1.6×0.81/16W~1/10W 0805=2.0×1.21/10W~1/8W 1206=3.2×1.61/8…

    2022年8月21日
    6
  • 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    2022年1月19日
    45
  • 解决IDEA插件安装慢、超时、不成功问题[通俗易懂]

    解决IDEA插件安装慢、超时、不成功问题[通俗易懂]解决IDEA插件安装慢、超时、不成功问题1.修改本地hosts文件,打开文件位置:Windows系统Hosts文件路径:C:\Windows\System32\drivers\etc\hosts用工具打开hosts文件2.打开国内插件的节点IP地址http://tool.chinaz.com/speedtest/plugins.jetbrains.com在检测结果中选择一个相对耗时少的IP地址,因为比较快然后按照第一步在hosts文件里加上即可,然后保存(需要以管理员身份)3.重

    2022年5月11日
    174

发表回复

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

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