字符串及内存函数(strlen、memmove)模拟实现

memcpy

memcpy为内存拷贝函数,拷贝方式为按字节拷贝。注意 目标字符串和原字符串不能有重叠。对于需要对有重叠的内存块进行拷贝时应使用memmove函数

void* my_memcpy(void*des, const void* sour, size_t n)
{
	assert(des&&sour);
	void* ret = des;
	while (n--)
	{
		*((char*)des)++ = *((char*)sour)++;
	}
	return ret;
}

strstr

strstr函数作用是返回字符串中首次出现子串的地址。

char* my_strstr(char* str1, const char* str2)
{
	assert(str1&& str2);
	char* p1 = NULL;
	const char* p2 = NULL;
	char* p = str1;

	while (p)
	{
		p1 = p;
		p2 = str2;

		while (*p1 != '\0'&&*p2 != '\0'&&*p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
			return p;
		p++;
	}
	return NULL;
}

strcat

函数的功能是将两个char类型连接。destination和source所指内存区域不可以重叠且destination必须有足够的空间来容纳source的字符串。

char * my_strcat(char * destination, const char * source)
{
	assert(destination);
	char* ret = destination;
	//走到\0
	while (*destination++);

	while (*destination++ = *source++);
	return ret;
}

strcmp

strcmp为字符串比较函数 当两个函数相等时返回0,当函数返回值大于0时,str1>str2,当函数返回值小于0时,str1<str2;

比较方法为比较对应位置字母的ASCII的大小。

int my_strcmp(const char* str1, const char*str2)
{
	assert(str1&& str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

strcpy

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

char* my_strcpy(char* des, const char* sour)
{
	char* ret = des;
	assert(des&&sour);
	while (*des++ = *sour++);
	return ret;
}

strlen

strlen函数为求字符串的长度,求的是字符串中\0之前的字符个数。

size_t my_strlen(const char* str)
{
	assert(str);
	size_t count = 0;
	while (*str++)
	{
		count++;
	}
	return count;
}

memmove

memmove可以对任意类型的数据进行拷贝,支持重叠拷贝。
在这里插入图片描述

void* my_memmove(void *dest, const void *src, size_t count)
{
	assert(dest&&src);
	if (dest <= src)
	{
		while (count--)
		{
			*((char*)dest)++ = *((char*)src)++;
		}
	}
	else
	{
		//倒着拷贝
		(char*)dest += count - 1;
		(char*)src += count - 1;

		while (count--)
		{
			*((char*)dest)-- = *((char*)src)--;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值