您的位置:首页 > 其它

学习笔记---mem族函数

2016-01-15 15:25 351 查看
void * memcpy ( void * destination, const void * source, size_t num );

功能:将以source作为起始地址的数据复制num个字节到以destination为起始地址的数据中,不支持destination和source重叠的情况。函数返回destination指针。

memcpy函数实现:

void *myMemcpy(void *dest, const void *src, int num)

{
assert(NULL != dest && NULL != src && num >0);

char *pDes = (char *)dest;
char *pSrc = (char*)src;

while (num--)
{
*pDes++ = *pSrc++;
}

*pDes = '\0';
return dest;

}

void * memset ( void * ptr, int value, size_t num );

功能:将以ptr作为起始地址的数据的num个字节设置为value。函数返回destination指针。

Memset函数实现:

void *myMemset(void *src, int value, size_t num)

{
assert(NULL != src && num > 0);

char *pSrc = (char*)src;
while (num--)
{
*pSrc++ = value;
}

return src;

}

 

 

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

功能:功能:将以source作为起始地址的数据的num个字节移动到以destination为起始地址的数据中,支持destination和source重叠的情况。函数返回destination指针。

memmove 函数实现:

void *myMemmove(void *dest, const void *src, int num)

{
assert(NULL != dest && NULL != src && num > 0);

char *pDest = (char*)dest;
char *pSrc = (char*)src;
//判断destination和source是否存在重叠
if (pDest + num < pSrc || pSrc + num < pDest)   //不存在重叠,正常从前向后复制  
{
while (num--)
{
*pDest++ = *pSrc++;
}
}
else  //存在重叠,防止信息丢失,从后向前复制
{
pDest = pDest + num - 1;
pSrc = pSrc + num - 1;

while (num--)
{
*pDest-- = *pSrc--;
}
}

return dest;

}

 

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:比较以ptr1为起始地址数据和以ptr2为起始地址的数据的num个字节大小情况。如果num个字节都相等,则相等,函数返回0。从起始位置开始,如果某个字节大,则prt1>ptr2,函数返回正数,否则ptr<ptr2,函数返回负数。、

Memcmp函数实现:

int myMemcmp(const void* dest, const void *src, int num)

{
assert(NULL != dest && NULL != src && num > 0);

char *pDest = (char*)dest;
char *pSrc = (char*)src;
int ret = 0;

while (!(ret = *(unsigned char*)pDest - *(unsigned char*)pSrc) && num--)
{
pDest++;
pSrc++;
}

return ret;

}

void * memchr (void * ptr, int value, size_t num ); 

功能:在以ptr作为起始地址的数据中的num个字节中查找value,如果查到,则返回value所在的地址,否则返回NULL。

具体实现如下:

memchr函数实现

void *myMemstr(const void *src, int value, size_t num)

{

assert(NULL != src && num > 0);
char *pSrc = (char*)src;

while (*pSrc && *pSrc != (char)value && num--)
{
pSrc++;
}
if (*pSrc == (char)value)
{
return pSrc;
}
return NULL;

}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  memcpy memcmp memset memchr