memcmp,memcpy,memmove,memset,strcat,strcmp,strcpy,strlen 8个函数的实现

为区别库函数,函数名首字母大写。


Memcmp函数:

//内存区域内容比较函数 
int  Memcmp(const void *buf1,const void *buf2,unsigned int count)
{
	unsigned int i=0;
	while(i<count)
	{
		if( ((char*)buf1)[i]!= ((char*)buf2)[i]     )
			return ((char*)buf1)[i]-((char*)buf2)[i];
		i++;
	}
	return 0;
}


Memcpy函数:

//内存的拷贝函数
#ifdef size_t   //需要定义size_t类型
#undef size_t
#endif
#ifndef size_t
#define size_t unsigned int
#endif
extern void*  Memcpy(void *dest,const void * src,size_t n)
{
	unsigned int i=0;
	while(i<n)
	{
		((char*)dest)[i]=((char*)src)[i];
		i++;
	}
	return dest;  // 返回拷贝后的内存指针
}

Memmove函数:

/*
memmove用于从src拷贝count个字符到dest,
如果目标区域和源区域有重叠的话,
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
但复制后src内容会被更改。
但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
*/
//函数原型
#ifdef size_t   //需要定义size_t类型
#undef size_t
#endif
#ifndef size_t
#define size_t unsigned int
#endif
void *Memmove( void *dest, const void *src, size_t count )
{
	int i=0;
	if(src==dest)
	{
	}
	else if(((char*)src+count)>(char*)dest && (char*)src<(char*)dest)  // 如果冲突
	{
		//从尾部循环赋值
		i=count-1;
		while(i>=0)
		{
			((char*)dest)[i]=((char*)src)[i];
			i--;
		}
		
	}
	else
	{
		while(i<count)
		{
			((char*)dest)[i]=((char*)src)[i];
			i++;
		}
	}
	return dest;
}


Memset函数:

//实现memset函数的功能
//内存区域初始化操作
//函数不能检查出指针越界情况  需要用户自行判断
#ifdef size_t   //需要定义size_t类型
#undef size_t
#endif

#ifndef size_t
#define size_t unsigned int
#endif
void * Memset(void *s,int ch,size_t n)
{
	int i=0;
	while(i<n)
	{
		*((char*)s+i)=ch;  //ch代表ascii码的整数值
		i++;   
	}
	return s;
}

Strcat函数:

//连接函数
//函数并不负责检查str1是否有足够的容量去容纳,需要用户自行判断
char * Strcat(char* str1,char* str2)
{
	int n=0,p=0;
	//获取下标
	while(str1[n]!='\0')
	{
		n++;
	}
	while(str2[p]!='\0')
	{
		str1[n+p]=str2[p];
		p++;
	}
	str1[n+p]='\0';
	return str1;
}

Strcmp函数:

//比较函数
int Strcmp(const char* str1,const char* str2)  
{
	int i=0;
	while(str1[i]&&str2[i]&&(str1[i]==str2[i]))   //好方法  算法特别精简
	{
		i++;
	}
	return str1[i]-str2[i];

}

Strcpy函数:

//字符串拷贝函数
void Strcpy(char* str1,char* str2)
{
	int i=0;
	while(str2[i]!='\0')
	{
		str1[i]=str2[i];
		i++;
	}
	str1[i]='\0';
}

Strlen函数:

//实现库函数strlen()的功能
//函数同一首字母大写 ,以区分库函数
#include<assert.h>
#ifndef NULL
#define NULL ((void*)0)
#endif

unsigned int Strlen(const char * str)
{
	unsigned int length=0;
	assert(str!=NULL);
	while(str[length]!='\0')
	{
		length++;
	}
	return length;
}


/*---------------
递归的形式  但没有断言部分
unsigned int Strlen(const char * str)
{
	if(*str=='\0')
		return 0;
	return 1+Strlen(str+1);
}
*/











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值