类字符串函数---内存函数的使用以及模拟实现(下)

Posted 执久呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类字符串函数---内存函数的使用以及模拟实现(下)相关的知识,希望对你有一定的参考价值。

 目录

一、前言

二、 memmove和memcmp函数

1.memmove函数(内存移动)

函数的使用:

memmove函数的模拟实现

2、memcmp函数(内存比较)

函数的使用:


一、前言

     前面我们已经讲了memcpymemset函数的使用,相信小伙伴们对这两个函数已经

非常熟悉了,(如果还不是很熟悉,可以看看上篇)那么我们现在要学习另外两个函数

memmovememcmp


本章内容memmove和memcmp函数

二、 memmove和memcmp函数

1.memmove函数(内存移动)

函数参数形式:void*memmove(void*destination,const void*source,size_t num);

其中num是无符号的整数,单位是字节。memcpy函数不能实现重复部分的拷贝,

如在同一个数组中无法实现,但是memmove可以实现重复内存拷贝。也可以说

memcpy是memmove的子集。

函数的使用

#include<stdio.h>

#include<string.h>

int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     
	memmove(arr1,arr1+2,20);

	for (int i = 0; i < 10; i++)
	{

		printf("%d ", arr1[i]);//34567678910

	}

	return 0;
}

memmove函数的模拟实现

#include<stdio.h>
#include<assert.h>

void*my_memmove(void*dest, const void*src, size_t num)
 {
	assert(dest&&src);
	void*ret = dest;
	
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++(char*)src;

		}
	}
	else
	{
		while (num--)
			{
				*((char*)dest + num) = *((char*)src + num);
				--(char*)dest;
				--(char*)src;
			}

	}

	return ret;

 }

int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

	my_memmove(arr1, arr1+2, 5 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{

		printf("%d", *(arr1 + i));//34567678910

	}
	return 0;
}


2、memcmp函数(内存比较)

  memcpy函数参数形式int memcmp(const void *str1,const void* str2,size_t num);

这个函数的返回类型是int ,nu单位是字节(一个int 4字节),str1大于str2返回一个

大于0的数,str1小于str2则返回一个小于0的数,等于则返回0。


#include<stdio.h>

#include<string.h>

int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7 };

	int arr2[10] = { 1, 2, 3, 4, 5, 8, 9 };

	int kc = memcmp(arr1, arr2, 20);

	printf("%d", kc);

	return 0;
}

注意:本电脑是小端存储模式(以后会讲),简单的说就是高位存高地址,大端则相反如1为

00000001,小端模式下为01000000。

简单的说一下:如图


 所以说在整形数组比较非一个整数的字节大小端就有区别了

在小端中:

#include<stdio.h>

#include<string.h>

int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7 };

	int arr2[10] = { 1, 2, 3, 4, 5, 8, 9 };

	int kc = memcmp(arr1, arr2, 21);

	printf("%d", kc);

	return 0;
}

 结果是一个小于0的数,vs编辑器默认是-1,原因在于前面20个字节相同,但是第21个字节,

如图:

 所以arr1小于arr2,返回小于0的数,如果是大端就不一样了,这里就不说那么多了,下次会涉及。

这期结束了,兄弟们一键三连

以上是关于类字符串函数---内存函数的使用以及模拟实现(下)的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶:字符串和内存函数

C语言篇 + 字符串处理函数和内存函数的介绍及模拟实现(避开你的语法坑,请注意查收)

模拟实现库函数strstr 以及模拟实现函数 memcpy

梦开始的地方 —— C语言内存函数memcpy-memmove-memset(使用+模拟实现)

超详细的C进阶教程!字符串及内存函数的使用及其模拟实现

在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现