#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
/*************** src拷贝长度n给dset *******************/
void *mymemcpy(void *dest, const void *src, size_t n)
{
char *d = (char*)dest;
char *s = (char*)src;
while(n--)
*d++ = *s++;
return dest;
}
/*************** src赋值为ch,共赋值n个 *******************/
void *mymemset(void *src, int ch, size_t n)
{
assert(src != NULL);
char *tempsrc = (char *)src;
while (n--)
*tempsrc++ = (char)ch;
//return src;
}
char *mystrlen(char *dest, const char *src)
{
//dest和src不相等且不为NULL
if ((dest == NULL) || (src == NULL))
return NULL;
if (dest == src)
return dest;
char *tempdest = dest;
while ((*dest++ = *src++) != '\0');
return tempdest;
}
/*************** src拷贝长度n给dset *******************/
void *mymemmove(void *dest, const void *src, size_t n)
{
char temp[n];
int i;
char *d = (char*)dest;
const char *s = (const char *)src;
for (i = 0; i < n; i++)
temp[i] = s[i];
for (i = 0; i < n; i++)
d[i] = temp[i];
return dest;
}
int main()
{
char a[] = "11111111111111";
char b[] = "22222222222222222";
char c[] = "333333";
char d[] = "4444";
char e[] = "55555555555555";
char f[] = "66666666666";
char g[] = "777777777777777777";
//mymemcpy(a,2,3);
mymemset(a, '+', 7);
printf("b[] == %s\n", b);
mymemcpy(b,a,10);
printf("a[] == %s\n", a);
printf("b[] == %s\n", b);
mystrlen(c,d);
printf("c[] == %s\n", c);
printf("d[] == %s\n", d);
strcpy(e, "111");
printf("e[] == %s\n", e);
//memcpy和memmove区别是,当内存发生局部重叠的时候
//memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确
mymemmove(f,g,5);
printf("f[] == %s\n", f);
printf("g[] == %s\n", g);
return 0;
}
memcpy和strcpy区别
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
memcpy和memmove的区别
1.内存重叠memcpy会有出现问题,memcpy是memmove的一部分