strcmp、strstr、memcpy、memmove的实现

本文详细介绍了C语言中常用的字符串比较函数strcmp、查找子串函数strstr以及内存拷贝函数memcpy和memmove。strcmp用于比较两个字符串,返回值表示字符串的相对大小。strstr用于查找子串在主串中的位置,若不存在则返回空指针。memcpy用于不重叠的内存块拷贝,而memmove则能在源和目标内存块重叠时安全地移动数据。这些函数是C语言中处理字符串和内存操作的基础工具。
摘要由CSDN通过智能技术生成

一、strcmp

1、定义

int strcmp(const char* str1, const char* str2);

2、功能解析

这个函数会比较两个字符串的第一个字符。如果它们相等,就继续比较下一对,直到字符不同或者遇到 '\0' 。str1和str2是两个待比较的字符串,如果第一个不匹配的字符在str1中的小,返回一个 <0 的值,如果在str1中的打,返回一个 >0 的值,两个字符串内容相等则返回 0 .

3、功能实现

4、代码测试

二、strstr

1、定义

const char* strstr(const char* str1, const char* str2);

2、功能解析

这个函数会返回一个指针,指向 str2 第一次在 str1 中出现的位置,如果 str2 不是 str1 的一部分,就返回一个空指针。匹配过程不会包括 '\0' ,但是会在 '\0' 处停止。

3、功能实现

#include <stdio.h>
#include <assert.h>
const char* MyStrstr(const char* str1, const char* str2)
{
	assert(str1 && str2);

	//如果str1找到了末尾,就结束循环
	while (*str1)
	{   //找到第一对匹配的字符
		while (*str1 != *str2 && *str1 != '\0')
			str1++;
		
		int i = 0;
		//这时候出现了第一对相等的字符,继续往下匹配
		while (*(str1 + i))
		{
			//因为第一对字符已经匹配过相等,所以i可以先++
			i++;
			//匹配过程中如果str2遇到了'\0',证明str1中有str2的内容
			if (*(str2 + i) == '\0')
				return str1;
			//如果在'\0'之前匹配到不相等的,就进行下一次的匹配
			if (*(str1 + i) != *(str2 + i))
				break;
		}
		//如果str1 + i 是'\0',意味着str1中已经不可能包含str2了
		if (*(str1 + i))
			str1++;
		else
			return NULL;
	}
	if (*str2 == '\0')
		return str1;
	else
		return NULL;
}

4、代码测试

三、memcpy

1、定义

void* memcpy(void* destination, const void* source, size_t num);

2、功能解析

这个函数会将 num 个字节的值从 source 指向的位置拷贝到 destination 指向的内存块;source 指针和 destination 指针指向的对象的底层类型与函数本身无关,结果是数据的二进制拷贝;函数不会在 source 中检测任何终止空字符,它会准确地拷贝 num 个字节;为了避免越界,destination 和 source 参数指向的数组大小,应该至少是 num 个字节,并且不会重叠。(对于重叠的内存块,memmove 是一个更安全的函数。)

destination 被返回。

3、功能实现

4、代码测试

 

四、memmove

1、定义

void* memmove(void* destination, const void* source, size_t num);

2、功能解析

在解析这个函数的功能之前,我们先来用上一个函数做一个事;

 很明显,memcpy函数无法做到,原因很简单,当想将 ‘c’ 拷贝的时候,'c' 原本的内容以及被 'a' 给覆盖,所以无法实现拷贝。因此,对于重叠的内存块,memcpy显得不安全。

接下来我们看memmove函数,这个函数可以实现内存块的移动。从 sourc 指向的位置拷贝 num 个字节的值到 destination 指向的内存块。进行拷贝事似乎使用了一个中间缓冲器,允许 destination 和 source 重叠。

source 指针和 destination 指针指向的对象的底层类型与函数本身无关,结果是数据的二进制拷贝;函数不会在 source 中检测任何终止空字符,它会准确地拷贝 num 个字节;为了避免越界,destination 和 source 参数指向的数组大小,应该至少是 num 个字节;

destination 被返回。

3、功能实现

这个函数在实现时,其实很简单,只要开辟一块空间拷贝一份原数据就可以实现。但我们可以试着尽可能少地开辟空间。

当 source 指向的位置在 destination 的前面时,我们从最后一个数据 5 开始拷贝,可以看到在拷贝之前,待拷贝的数据不会被覆盖

而当 source 指向的位置在 destination 的后面时,从第一个数据 5 开始拷贝,也可以实现这样的效果。 

 

4、代码测试

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王红花x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值