Mem库函数模拟实现

本篇视图:


(1)memset

(2)memcpy

(3)memmove

(4)memcmp

(5)memchr


memset


功能:将一段内存初始化为某个值;函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。


函数原型:void *memset( void *buffer, int ch, size_t count );


代码实现:


void* MyMemset(void* bf, int ch, size_t n)
{
	assert(bf);
	void* ptr = bf;
	while (n--)
	{
		*(char*)bf = ch;
		bf = (char*)bf + 1;
	}
	return ptr;
}

memcpy


功能:函数从from中复制count 个字符到to中,并返回to指针两者重叠时,不能正常进行;


函数原型:void *memcpy( void *to, const void *from, size_t count );


代码实现:


void* MyMemcpy(void* dst, const void* src, size_t count)
{
	assert(dst && src);
	void *ret = dst;
	while (count--)
	{
		*(char *)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}

memmove


功能:函数从from中复制count 个字符到to中,并返回to指针两者重叠时,依旧可以正常进行


函数原型:void *memcpy( void *to, const void *from, size_t count );


代码实现:


void MyMemove(void* dst, const void* src, size_t count)
{
	assert(dst && src);
	void* ret = dst;
	if (dst < src || (char*)dst>(char*)src + count)
	{
		while (count--)			//从前向后拷
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else           //从后向前拷
	{
		dst = (void *)(*(char*)dst + count - 1);
		src = (void *)(*(char*)src + count - 1);
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
}

memcmp


功能:函数比较buffer1 和 buffer2的前count 个字符


函数原型: int memcmp( const void *buffer1, const void *buffer2, size_t count );


代码实现:


int MyMemcmp(const void* dst, const void* src, size_t size)
{
	assert(dst&&src);
	if (!size)
		return 0;
	while (size--)
	{
		if (*(char*)dst == *(char*)src)
		{
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
		else if (*(char*)dst > *(char*)src)
		{
			return (*(char*)dst - *(char*)src);
		}
		else
		{
			return (*(char*)dst - *(char*)src);
		}
	}
	return 0;
}

memchr


功能:函数在buffer指向的数组的count个字符的字符串里查找ch 首次出现的位置,返回一个指针,指向ch 在字符串中首次出现的位置, 如果ch 没有在字符串中找到,返回NULL。

函数原型:void *memchr( const void *buffer, int ch, size_t count );


代码实现:


void* MyMemchr(const void* ptr, int ch, size_t size)
{
	assert(ptr && size >= 0);
	while (size && (*(char*)ptr != ch))
	{
		size--;
		ptr = (char*)ptr + 1;
	}
	if (size)
	{
		return (void*)ptr;
	}
	else
	{
		return NULL;
	}
}

你可能感兴趣的:(c库模拟,C语言学习总结)