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);//当返回的字符串首地址不为空,则会从字符串首地址开始打印,到‘
#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;
}
’停止
} 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;
}

结果·:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Atom动态代码插件Activate Power Mode常用设置[通俗易懂]

    Atom动态代码插件Activate Power Mode常用设置[通俗易懂]相信用过Atom的人都知道它很方便,那么小编在这就介绍下ActivatePowerMode插件的一些实用设置如下:效果的起步阈值:刚装上插件后,效果是你按了20个代码后才有动态效果,在这里可以修改为立马有动态效果目录:Setting/ComboMode中找ComboMode-ActivationThreshold动态效果的声音调节:小编吐槽以下,我网上百度了下怎么调节声音大小,结果就没

  • lspci 安装_ipswme下载的系统如何安装

    lspci 安装_ipswme下载的系统如何安装在原版的busy-box做出来的文件系统中,lspci命令只有两个选项:ynq>lspci-hlspci:invalidoption–‘h’BusyBoxv1.20.1(2012-11-2713:37:12MST)multi-callbinary.Usage:lspci[-mk]ListallPCIdevices-m

  • 如何使用Powershell脚本监控Exchange2010(前言)

    如何使用Powershell脚本监控Exchange2010(前言)

  • 你太强了我只能躺啊哈哈哈(超我太强的原因)

    大家好,我是二哥呀!之前在送书的时候做了一个小调查,问题是:“你是怎么认识二哥的?”我以为从知乎上了解的多一些,没想到,CSDN上的最多,看来二哥还是在CSDN上更有影响力一些,这个结果多少让我感到有些意外,因为我最近在知乎上更新得更勤快一些。写这篇文章的时候,我去CSDN上看了一眼我的主页。访问量突破了900万!按照目前的增长速度来看,年底突破1000万访问量应该没啥大问题。另外还有一些数据我觉得也挺牛逼的:原创文章数量957篇;作者总榜第12名;作者周榜第

  • setContentView源码分析[通俗易懂]

    setContentView源码分析[通俗易懂]publicclassActivityTestextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_test);}}↓…

  • 查看linux执行的命令记录_linuxhistory命令

    查看linux执行的命令记录_linuxhistory命令前言我们每次敲打linux命令的时候,有时候想用之前用过的命令,一般情况下,我们都会按↑↓箭头来寻找历史的命令记录,那如果我想用1天前执行的某条命令,难道还要按↑100次?显示这样是不现实的,我们可

发表回复

您的电子邮箱地址不会被公开。

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