strcmp与strstr函数的模拟实现

(一)strcmp函数的模拟实现

strcmp函数原型

cs 复制代码
int strcmp(const char *str1, const char *str2);

strcmp函数的功能是按ASCII码依次逐字符对比两个字符串,直到出现不同字符或者遇到 \0 。 返回值规则

  1. str1 > str2 → 返回 大于0的整数​ 2。 str1 == str2 → 返回 0 。​3. str1 < str2 → 返回 小于0的整数

1.理论分析:

创建两个指针分别指向两个待比较的字符串,用while循环持续比较两个字符串的字符,while后面()中的条件填写*str1==*str2,因为只有此时的两个字符相等,才能继续往下比较,这里要注意,在while循环里面要加一个条件判断语句,判断此时两个字符都相等时的str1或str2是否为\0,如果是,那么就证明已经比较完成,两个字符串相等,返回0,如果不=\0,两个指针分别向后+1,如果不相等了,不满足while循环的条件了,那么跳出while循环,直接返回*str1-*str2的值,如果str1>str2,那么就会返回>0的值,否则相反

2.代码实现

cs 复制代码
int my_strcmp(char* str1, char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}
int main()

{
	char str1[] = "abc";
	char str2[] = "abd";
	int ret = my_strcmp(str1, str2);
	printf("%d", ret);
	return 0;
}

(二)strstr函数的模拟实现

strstr函数的原型

strstr函数的功能是在字符串 str 中查找子串 substr 首次出现的位置。 1. 找到:返回子串首字符的指针 ​2. 找不到:返回 NULL ​ 3. 如果 substr 是空字符串 "" ,直接返回 str

1.理论分析:

strstr的模拟函数实现有点复杂,我们需要讨论多个情况

一:

cs 复制代码
char str[] = "abcdef";
char sub[] = "abc";

如上代码中,能在str一开始中直接找到sub中的字符,那么在模拟函数中,用两个指针分别指向str的和sub,然后将*str==*sub作为while循环里的条件,逐渐+1,直至*sub==/0,代表全部查找完成,然后返回此时str首元素的地址

二:

cs 复制代码
char str[] = "abcdef";
char sub[] = "cde";

如上代码中,在str中间部分找到sub中的部分,那么在模拟函数中,用两个指针s1和s2分别指向str的和sub,将*s1!=*s2&&*s1!=\0&&*s2!=\0作为while循环里面的条件,表示此时指针指向的s1不等于s2,同时不等于\0代表没找完,所以让两个指针分别向后+1,继续比较,如果跳出这个while循环,再判断如果s2指向了\0的位置,那么代表查找完毕,返回此时的s1的指针

三:

cs 复制代码
char str[] = "abcdddef";
char sub[] = "dde";

如上代码中,第一次能在str中查找到sub中的前两个元素,但是继续往后比较却不相等了,那么此时应该从第一次配对成功的地方,指针往后+1,然后sub的指针得重新指向其原来的首元素地址重新比较,此时我们就需要额外的一个指针来标记第一次配对成功时str1的地址,当后面配对一半失败时,直接调用这个指针往后+1,重新配对

结合上述三种情况,我们用如下代码实现

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

char* my_strstr(const char* str, const char* sub)
{
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* ch = str;
	if (*sub == '\0')
	{
		return str;
	}
	while (*ch)
	{
		s1 = ch;
		s2 = sub;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return ch;
		}
		ch++;
	}
	return NULL;
}
int main()

{
	char str[] = "abcdddef";
	char sub[] = "dde";
	const char* ret = my_strstr(str, sub);
	if (ret != NULL)
	{
		printf("%s", ret);
	}
	else
		printf("没找到");
	return 0;
}
相关推荐
猴子15516812 分钟前
长期追踪调研的样本留存是怎么实现的:跨波次对齐、催答调度与质控机制,附五家样本服务实测记录
大数据·经验分享
“AI国潮设计-小江”2 分钟前
《【AIGC实战】Python+SDXL批量生成“猫咪英歌舞蛋挞”IP,附保持角色一致性的代码逻辑》
开发语言·人工智能·python·prompt·aigc
weixin_BYSJ19878 分钟前
【计算机毕设】基于Spring_Boot_Vue的马拉松报名与选手成绩追踪系统05445
java·vue.js·spring boot·学习·spring·django·课程设计
艾莉丝努力练剑10 分钟前
【AI大模型接入SDK】ChatServer HTTP接口模块实现总览
网络·c++·人工智能·网络协议·学习·http·架构
坤坤子吖18 分钟前
Linux 线程概念与控制——线程创建、退出与等待
linux·开发语言·c++·笔记·学习
薛一半19 分钟前
Redux实战:组件状态管理全解析
开发语言·前端·javascript·react.js
weixin_3077791323 分钟前
C++代码实现MATLAB中的fitnlm函数功能
开发语言·c++·算法·matlab
m4Rk_24 分钟前
【论文阅读】Agent 记忆机制(103):Dynamic Coding Memory——记忆为何让 Agent 更可靠,却可能更平庸
论文阅读·人工智能·学习·开源·github
qq_2842740534 分钟前
间歇运动机构与机械设计概论:棘轮与槽轮机构运动系数、零件失效与强度刚度准则、结构工艺性清根及标准件(含考点)
笔记·学习·平面·自动化·制造