天天看点

strcpy,strcmp,strcat,memcpy,memmov,memset,memcmp的实现

//  [11/10/2013 qingezha] 直接拷贝,不考虑覆盖问题,效率优先
char* strcpy_my(char * dest,char * src) // 实现src到dest的复制
{
	if(!src||!dest)
		return NULL;
	char* stedest = dest;				//保存目标字符串的首地址
	while ((*dest++ = *src++)!='\0');	//这里是把结束符也复制进去了!!!!!!!!!!
	return stedest;						//把src字符串的内容复制到dest下
}
           

strcpy 只针对字符,而memcpy针对内存,不管里面存放的是啥内容,可以拷贝内建类型与自定义类型,其他与strcpy一样,不考虑覆盖问题

//  [9/22/2013 qingezha] 注意指针类型要转换,不能对void 类型进行++运算
//	但当源内存和目标内存存在重叠时,memcpy会出现错误,
//	而memmove能正确地实施拷贝,但这也增加了一点点开销。
void * my_memcpy(void *des, void *src, size_t count)
{
	if(des == NULL || src == NULL || count <= 0) 
		return NULL;
	char *dess = (char *)des;			//这里要类型转换
	char *srcs = (char *)src;
	char *ret = dess;
	int temp = count;
	while(count)
	{
		*dess++ = *srcs++;
		--count;
	}
	*(ret + temp) = '\0';
	return ret;
}
           

memmov移动时考虑覆盖问题,根据目的地址与源地址的相对位置,对应的采取从后向前拷贝还是从前向后拷贝

//  [9/24/2013 qingezha] 判断地址重叠
void * my_memmov(void *dest, void *src, size_t n)
{
	{
		char*     d  = (char*) dest;
		const char*  s = (const char*) src;

		if (s>d)				//目的地址在前面,从头复制
		{
			while (n--)
				*d++ = *s++;
		}
		else if (s<d)			//目的地址在后面,从尾部复制
		{
			d = d+n-1;
			s = s+n-1;

			while (n--)
				*d-- = *s--;
		}
		return dest;

	}
}
           

memset 用来对一段内存空间置为某一个字符,或其他

//  [11/10/2013 qingezha]
void* my_memset(char *ch,char c,size_t n)
{
	if(ch==NULL || n<=0)
		return ch;
	for (int i=0;i<n;i++)
	{
		ch[i]=c;
	}
	return ch;
}
           

memcmp比较内存中对应值的大小

int my_memcmp(const void *buf1,const void *buf2,size_t count)
{
	if (buf1==NULL||buf2==NULL||count<=0)
	{
		return 0;
	}
	while(count--&&*(char*)buf1==*(char*)buf2)
	{
		buf1=(char*)buf1+1;
		buf2=(char*)buf2+1;
	}
	return *(char*)buf1-*(char*)buf2;
}
           

strcat字符连接

//  [11/10/2013 qingezha]
char * my_strcat(char *des,const char *src)
{
	if (des==NULL||src==NULL)
	{
		return des;
	}
	char *ch = des;
	while(*ch)
		ch++;
	while(*ch++=*src++);
	return des;
}
           

strcmp 字符串比较

//  [11/10/2013 qingezha]
int my_strcmp(const char *des,const char *src)
{
	int dis=0;
	while(!(dis=*des-*src)&&*des&&*src)//相同的时候继续比较
	{
		src++;
		des++;
	}
	if (dis>0)
	{
		dis = 1;
	} 
	else
	{
		dis = -1;
	}
	return dis;
}
           

继续阅读