字符及字符串函数+内存函数!模拟实现!

  • strlen
  • strcpy
  • strcat
  • strcmp
  • strstr
  • memcpy
  • memmove

1.strlen

size_t strlen ( const char * str ) 

strlen函数是用来计算字符串的长度的,函数返回值是'\0'前的字符个数(不包括'\0')。 注意:返回值的类型应为size_t(无符号整型)。

strlen的模拟实现:

在这里只要有指针作为函数的参数都应进行assert断言指针不为NULL。 

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

2.strcpy

char * strcpy ( char * destination, const char * source )

 strcpy函数是用来拷贝源字符串到目标字符串的函数,返回值是目标字符串的首地址。注意:拷贝包括源字符串的结尾'\0'。

strcpy的模拟实现:

同上一段代码同样要断言指针不为NULL。

char* my_strcpy(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++);
	return ret;
}

3.strcat

 *char strcat ( char * destination, const char * source )

 将源字符串追加到目标字符串的位置,目标字符串结束标志被覆盖,源字符串的'\0'也要被追加过去。

strcat的模拟实现:

也要断言指针不为NULL。

char* my_strcat(char* dest, const char* sorc)
{
	assert(dest && sorc);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *sorc++);
	*dest = *sorc;// \0也要追加过去
	return ret;
}

 4.strcmp

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

将字符串1与字符串2进行比较(注意:比较的方式是一位一位往后比)。如果字符串1与字符串2每一位比较后的每一个字符的Ascii码值都相等则返回0。如果字符串1与字符串2对应的一位字符的Ascii码值不相等,则字符串1的小于2的返回负数,字符串2的大于1的返回正数。

strcmp的模拟实现:

断言指针不为NULL

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

 5.strstr

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

此函数是用来查找一个字符串里是否包含子串,当字符串包含此字串时,返回字符串里字串的首元素地址,若未查找到字串则返回的是NULL指针。

strstr的模拟实现:

断言指针不为NULL

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;
}

 

 6.memcpy

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

此函数可以将源地址后面的num个字节拷贝到目标地址中,当源地址所管理的空间大于要拷贝的字节数时,拷贝完成后应加上'\0',若小于要拷贝的字节数时则直接将源地址处的数据全部拷贝到目标地址处包括'\0',返回值为目标地址。注意:此函数自从被设计以来对于自身的拷贝有着缺陷,它的目的就是为了拷贝一个地址处的数据到目标地址处,并不考虑是否有重合,如过要考虑有重合的情况请看第七个函数memmove。

memcpy函数的模拟实现:

断言指针不为NULL

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while(num--)
	{
		*(char*)dest = *(char*)src;
		(char*)dest = (char*)dest + 1;
		(char*)src = (char*)src + 1;
	}
	return ret;
}

7.memmove 

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

此函数拥有与memcpy一样的功能,但是可以拷贝重叠的部分。参数参考memcpy。

memmove的模拟实现:

断言指针不为NULL

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

 

一键三连点波关注哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值