学习笔记---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;
}
功能:将以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;
}
相关文章推荐
- 详解C语言中的memset()函数
- memset函数的使用分析
- 字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较
- 基于C++执行内存memcpy效率测试的分析
- C++中memcpy和memmove的区别总结
- ZeroMemory、memset 和 “={0}” 三者用于清零操作的区别
- C--memcpy
- memcpy 拷贝函数
- JAVA中类似C中memcpy功能
- 关于字符串操作
- memset用法详解
- strcpy和memcpy的区别与实现
- memset与memcpy
- C++学习小记(memcpy、memmove、memccpy以及memset)
- C++实现带类型安全检测的memset
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- 最近碰到的一个关于memcpy的奇葩问题
- strcpy()和memcpy()函数中忽略的内存覆盖问题
- C++ memset
- 用C语言模拟实现memcpy函数,memmove函数和memset函数