「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
memcpy函数和memmove函数的区别
C语言库函数中,二者都可以进行重叠和不重叠的内存拷贝
但是C语言标准只规定了memcpy函数可以实现内存不重叠的问题即可,内存重叠的问题交给memmove函数处理
memcmp:内存比较函数
比较前count个字节
使用strcmp()只能比较字符串,而memcmp()可以比较整形,也可以比较字符串
int main()
{
int arr1[] = {1,2,3,4};
//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
int arr2[] = {1,2,3,5};
//01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00
int ret = memcmp(arr1,arr2,12);
//比较前12个字节,二者相同,返回0
printf("%d\n",ret);//0
ret = memcmp(arr1,arr2,13);
//比较前13个字节,arr1中的04比arr2中的05小,返回-1
printf("%d\n",ret); //-1
}
模拟实现memcmp()
注意:由于不知道传过来的是什么类型->使用void*类型接收,由于要比较的字节数恒大于0,所以用size_t接收,
由于只知道要比较的字节数,不知道是什么类型->所以使用char* 一个字节一个字节的向后比较,直到找到二者中字节对应内容不相等时,比较此时二者字节内容
int my_memcmp(const void* p1, const void* p2, size_t count)
{
assert(p1 && p2);
while (count--)
{
//如果二者指向的一个字节内容相等->指向下一个字节
if (*(char*) p1 == *(char*)p2)
{
p1 = (char*)p1+1;
p2 = (char*)p2+1;
}
else
{
//此时二者指向的字节内容不相同
//通过强转为char* 比较此时二者指向的一个字节内容
if ((*(char*)p1 - *(char*)p2) > 0)
{
return 1;
}
else
{
return -1;
}
}
}
//跳出循环时,count = 0,说明二者要比较的字节的内容都相同
return 0;
}
int main()
{
int arr1[] = { 1,2,3,4 };
//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
int arr2[] = { 1,2,3,99 };
//01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00
int ret = my_memcmp(arr1, arr2, 12);
//比较前12个字节,二者相同,返回0
printf("%d\n", ret); //0
ret = my_memcmp(arr1, arr2, 13);
//比较前13个字节,arr1中的04比arr2中的05小,返回-1
printf("%d\n", ret); //-1
char* p1 = "Mangopp";
char* p2 = "Mangoppp";
ret = memcmp(p1, p2, 8);
printf("%d\n", ret); //-1
}