概述
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
// 内存copy函数
void *my_memcpy(void *dest, const void *src, int n)
{
assert((NULL != dest) && (NULL != src)); //判断指针的有效性
char *pdest = (char *)dest;
char *psrc = (char *)src; //转换成char类型,一个字节一个字节的传输
while(n--)
*pdest++ = *psrc++; //每次传输一字节
return pdest;
}
/**
* memcpy在内存没有重复的情况下能够正确复制,若有重叠情况则复制结果错误,但是它的效率比memmove高。
* 所以,在确定没有重复的情况下用memcpy,在不确定是否有内存重复的情况用memmove。
*/
void *my_memmove(void *dest, const void *src, int n)
{
assert((NULL != dest) && (NULL != src));
char *pdest = (char *)dest; //转换成char类型,一个字节一个字节的传输
char *psrc = (char *)src;
if((pdest <= psrc) || (pdest >= psrc + n)) //从前往后复制,则不会出现覆盖src中没有复制的内容
{
while(n--)
*pdest++ = *psrc++;
}
else
{
pdest = pdest + n -1; //有内存重叠时,从高字节开始传输
psrc = psrc + n -1; //移动到末尾
while(n--)
*pdest-- = *psrc--; //每次移动一个字节
}
return pdest;
}
// 作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
void *my_memset(void *s, int c, int n)
{
assert(NULL != s);
unsigned char *buff = (char *)s;
while(n--)
{
*(buff++) = (char)c;
}
return buff;
}
/** memcmp函数会逐字节比较s1和s2所指内存区,
* s1 > s2 —-> 返回 >0 的值
* s1 = s2 —-> 返回 =0 的值
* s1 < s2 —-> 返回 <0 的值
*/
int my_memcmp(const void *s1, const void *s2, int n)
{
assert((NULL != s1) && (NULL != s2));
int result;
while(!(result = *(unsigned char *)s1 - *(unsigned char *)s2) && (n--))
{
s1++; s2++;
}
return result;
}
// 当第一次遇到字符c时停止查找。如果成功,返回指向字符c的指针;否则返回NULL。
void *my_memchr(const void *s, int c, int n)
{
assert(NULL != s);
int result;
while((*(unsigned char *)(s) != (unsigned char)c) && (n--))
{
s++;
}
return (n ? (void *)s : NULL);
}
char *my_strcpy(char *dest, const char *src)
{
assert((NULL != dest) && (NULL != src));//判断指针的有效性
char *addr = dest;
while((*dest++ = *src++) != '