memmove 是在memcpy基础上的升级版
注意函数的返回类型和 指针类型皆为void* 说明函数适应于不同类型的数据结构
并不局限于整形或字符串
函数具体实现逻辑在篇尾
void* my_memmove(void* dest, const void* src, size_t count)
这里const修饰后面src 前面dest不被修饰是由于 运行后dest将被改变 而src是源字符串自始至终未被改变所以要用const修饰来限制src指针
{
assert(dest && src);
由于防止出现空指针 所以这里要断言 若出现空指针则程序无法运行
void* ret = dest;
//前后形
//if (dest < src)
//{
// //前->后
// while (count--)
// {
// *(char*)dest = *(char*)src;
// dest = (char*)dest + 1;
// src = (char*)src + 1;
// }
//}
//else
//{
// //后->前
// while (count--)
// {
// *((char*)dest + count) = *((char*)src + count);
// }
//}
//两头形
if (dest > src && dest < (void*)((char*)src + count))//注意char*和返回值类型不同 需强转
{
//后->前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
else
{
//前->后
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
int main()
{
int arr1[9] = { 1,2,3,4,5,6,7,8,9 };
my_memmove(arr1 + 3, arr1, 20);
int sz = sizeof(arr1) / sizeof(arr1[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
该代码运行结果为123123459
strtok为分割字符串函数,可根据字符串中指定符号 来分割字符串
1 2 3 4 5 6 7 8 9
若相反dest 就是8覆盖1,7覆盖2,6覆盖3,5覆盖4,这样到4覆盖是找不到初始值4 而是覆盖后的5 所以不行 dest>src 时同理



