1.memmove
1.1定义
void *memmove( void *dest, const void *src, size_t count );
1.2注意
与memcpy的差别是memmove函数处理的源内存块和目标内存块可以重叠。
(若源空间和目标空间出现重叠,使用memmove函数处理。)
1.3应用
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "memmove can be very useful######";
下标 0 15 20
memmove(str + 20, str + 15, 11);
str+20:useful######
str+15:very useful######
11 :very useful
puts(str);
memmove can be very very useful#
return 0;
}
1.4模拟实现
法一:三类实现
void* memmove(void* dst, const void* src, size_t c)
{
void* ret = dst;
if (dst <= src || (char*)dst >= ((char*)src + c))
{
while (c--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + c - 1;
src = (char*)src + c - 1;
while (c--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}
法二:三类统两类
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, int c)
{
assert(dest && src);
void* ret = dest;
if (src > dest)
{
while (c--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (c--)
*((char*)dest + c) = *((char*)src + c);
}
return ret;
}
void print(int* arr, int sz)
{
for (int i = 0; i < sz; i++)
printf("%d ", arr[i]);
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(a + 3, a + 1, 20);
int sz = sizeof(a) / sizeof(a[0]);
print(a, sz);
printf("\n");
return 0;
}
2.memcpy
1.1定义
void *memcpy( void *dest, const void *src, size_t count );
1.2注意
- memcpy从src开始向后复制num个字节数据到dest。
- 遇到 ‘\0’ 不停。
- src和dest有任何重叠,复制结果未定义。
1.3应用
#include <stdio.h>
#include <string.h>
typedef struct person
{
char name[40];
int age;
} Per;
int main()
{
Per P, p;
char s[] = "William van Gogh";
memcpy(P.name, s, strlen(s) + 1);
P.age = 46;
memcpy(&p, &P, sizeof(P));
printf("p: %s\n%5d \n", p.name, p.age);
return 0;
}
1.4模拟实现
void* memcpy(void* dst, const void* src, size_t c)
{
void* ret = dst;
assert(dst && src);
while (c--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
3.memcmp
3.1定义
int memcmp( const void *buf1, const void *buf2, size_t count );
3.2 注意
该函数按字节比较
注意返回值
3.3应用
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "DWgaOtP12df0";
char b[] = "DWGAOTP12DF0";
int n = memcmp(a, b, sizeof(a));
if (n > 0)
printf("'%s' is greater than '%s'.\n", a, b);
else if (n < 0)
printf("'%s' is less than '%s'.\n", a, b);
else
printf("'%s' is the same as '%s'.\n", a, b);
return 0;
}
3.4模拟实现
int my_memcmp(void* a, void* b, size_t n)
{
assert(a && b);
while (n--)
{
if (*(char*)a == *((char*)b))
{
a = (char*)a + 1;
b = (char*)b + 1;
}
else
return (*(char*)a - *((char*)b));
}
return 0;
}
int main()
{
char a[10] = "abcdef";
char b[10] = "abcdefg";
int ret = my_memcmp(a, b, 8);
printf("%d", ret);
return 0;
}