模拟memcpy函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
/*
模拟memcpy函数,其库函数为<string.h>
函数作用:
将后一个字符串或数组内的值传给第一个字符串或数组,传递的数量由整数决定
函数原型
void * memcpy ( void * destination, const void * source, size_t num );
指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
要复制的字节数。size_t 是无符号整数类型。
为避免溢出,目标和源参数指向的数组大小应至少为字节数,并且不应重叠
*/
void* my_memcpy(char* p, char* q, int num)
{
for (int i = 0; i < num; ++i)
{
*p = *q;
p++;
q++;
}
*p = '\0';
//这里手动添加字符串终止符,让它复制m个字符就停止,原函数没有
//如果被赋值的字符串有原内容,则会被覆盖,超出m的部分也会消失
//可以不添加该语句,但是超出m的原有内容会保留下来
}
int main()
{
char a[100] = { 0 };
char b[10] = { 0 };
int n = 0;
char* p = a;
char* q = b;
for (int i = 0; i < 10; ++i)
{
scanf("%c ", &b[i]);
}
scanf("%d", &n);
my_memcpy(p, q, n);
for (int i = 0; i < 10; ++i)
{
printf("%c ", a[i]);
}
if (*p != NULL || *q != NULL)
{
*p = NULL;
*q = NULL;
}
return 0;
}
/*
输入案例1
a b c d e f g h i j
10
输出案例
a b c d e f g h i j
输入案例2
a b c d e f g h i j
5
输出案例
a b c d e
*/
模拟memmove函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
/*
模拟memmove函数,其库函数为<string.h>
函数作用:
将后一个字符串或数组内的值传给第一个字符串或数组,传递的数量由整数决定
函数原型
void * memmove ( void * destination, const void * source, size_t num );
指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
要复制的字节数。size_t 是无符号整数类型。
该函数不检查源中的任何终止空字符 - 它总是准确地复制字节数。
为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数。
复制就像使用了中间缓冲区一样,允许目标和源重叠。
*/
void* my_memove(void* dest, void* src, size_t num)
{
void* ret = dest;
if (dest < src)
//当目标区域不会与源区域重叠时,从头往后一个一个字节拷贝
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else//当目标区域与源区域重叠时,从后往前一个一个字节的拷贝
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int n = 0;
scanf("%d", &n);
my_memove(arr1 + 2, arr1, n*4);
//20单位为字节,一个int = 4个字节,所以复制5个int型
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
/*
输入案例1
3
输出案例
1 2 1 2 3 6 7 8 9 10
输入案例2
5
输出案例
1 2 1 2 3 4 5 8 9 10
*/