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;
}
相关推荐
晓蛋4 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
上海广测检测科技有限公司4 天前
智能平板出口巴西合规详解:Anatel射频、Inmetro电源/电池与LGPD数据合规叠加
经验分享
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊4 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本4 天前
离散数学第六课
学习·离散数学
牵猫散步的鱼儿4 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python