自定义实现memmove函数
1.库文件中memmove的参数为
void * memmove ( void * destination, const void * source, size_t num );
destination:目的字符串
source:源字符串
num:要复制的字节数
2.源字符串和目的字符串在同一个自字符串上
字符串改变之后会导致赋值完成之后的字符串不是自己想要的
分类讨论
1.如果目的字符串在源字符串的右边,则可以从前往后复制,不改变结果
//pdst:目的字符串指针
//psrc:源字符串指针
for (size_t i = 0; i < num; i++)
{
//之前写的是
//++*pdst=++*psrc;
//不知道为什么是错误的
*(pdst + i - 1) = *(psrc + i - 1);
}
2…如果目的字符串在源字符串的右边,则可以从后往前复制,不改变结果
for (size_t i = num; i > 0; i--)
{
*(pdst + i - 1) = *(psrc + i - 1);
}
总体的函数程序为
void* my_memmove(void* dest, void* src, size_t num)
{
assert(dest && src);
unsigned char* pdst = (unsigned char*)dest;
unsigned char* psrc = (unsigned char*)src;
if (pdst > psrc)
{
for (size_t i = num; i > 0; i--)
{
*(pdst + i - 1) = *(psrc + i - 1);
}
}
else
{
for (size_t i = 0; i < num; i++)
{
*(pdst + i - 1) = *(psrc + i - 1);
}
}
return pdst;
}
#我自己在VS 2019上写的程序为:
//void * memmove ( void * destination, const void * source, size_t num );
void* my_memmove(void* dest,const void* src, size_t num)
{
assert(dest && src);
unsigned char* pdst = (unsigned char*)dest;
unsigned char* psrc = (unsigned char*)src;
if (pdst > psrc)
{
for (size_t i = num; i > 0; i--)
{
*(pdst + i - 1) = *(psrc + i - 1);
}
}
else
{
for (size_t i = 0; i < num; i++)
{
*(pdst + i - 1) = *(psrc + i - 1);
}
}
return pdst;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
//memmove(arr + 2, arr, 20);
for (int i = 0; i < (sizeof(arr) / sizeof(int)); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
运行结果:
希望可以帮助到大家!!