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;
}
相关推荐
小黄人软件1 小时前
如何解决不想学、学不会、学不进去,吸收内化不了学的东西,怎么办?如何真正建立“知识内化系统“?不输出,不学习
学习
bksczm2 小时前
Linux之日志和线程池、内存池
java·开发语言
三十岁老牛再出发2 小时前
07.26每日总结
linux·c语言·mysql
笨蛋不要掉眼泪2 小时前
Java虚拟机:对象复活、引用强度与Stop-The-World
java·开发语言·jvm
布朗克1682 小时前
Go 入门到精通-33-unsafe 与 CGO
开发语言·后端·golang·unsafe·cgo
157092511342 小时前
【无标题】
开发语言·python·算法
xieliyu.3 小时前
MySQL 存储过程详解:概念、创建与删除全教程
开发语言·数据库·mysql
小羊先生car3 小时前
RTOS-F429-HAL-基础内容认识(2026/7/26)
c语言
晓梦林3 小时前
[ACTF2020 新生赛]BackupFile学习笔记
android·笔记·学习