头文件: <string.h>
1. memcpy 使⽤和模拟实现
memcpy - 用于拷贝(复制)数组到另一个数组里
使用语法:
void * memcpy ( void * destination, const void * source, size_t num );
| | |
| | 要复制的字节数
| 被复制数组起始位置(源内存块)
目标数组起始位置(目标内存块)
三点注意;
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
- 这个函数在遇到 ‘\0’ 的时候并不会停下来,遇到\0会一起复制
- 如果source和destination有任何的重叠,复制的结果都是未定义的。–不要在同一个数组中使用
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arr2[10] = {0};
memcpy(arr2, arr1, sizeof(int) * 10);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行结果:
1 2 3 4 5 0 0 0 0 0
memcpy函数的模拟实现:
void *memcpy(void *dst, const void *src, size_t count)
{
void *ret = dst;
assert(dst);
assert(src);
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return (ret);
}
- 用char * 一个一个字节复制,可以接受所有类型的复制
2. memmove 使⽤和模拟实现
memmove - 用于移动一个内存块到另一块内存块,在同一个数组中,源内存块和⽬标内存块是可以重叠的。
void * memmove ( void * destination, const void * source, size_t num );
| | |
| | 要复制的字节数
| 源内存块
目标内存块
使用:
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memmove(arr1 + 2, arr1, sizeof(int)*5);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
运行结果:
1 2 1 2 3 4 5 8 9 10
其复制时会判断情况:(不在同个数组时,其用法与memcpy一致)
- 在同一个数组时,如果source在destination之后,或者source+count的之后到达不了destination,就会正常的从前往后一个字节一个字节的打印
- 除此之外,memmove都会从后往前一个字节一个字节打印
memmove的模拟实现:
void *memmove(void *dst, const void *src, size_t count)
{
void *ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))
{
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return (ret);
}
3. memset 函数的使用
memset - 用于直接设置一段内存为相同的数,一般用于初始化
void * memset ( void * ptr, int value, size_t num );
| | |
| | 要复制的字节数
| 设置初始化的数
目标内存块
使用:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "hello world";
memset (str,'x',6);
printf(str);
return 0;
}
运行结果:
xxxxxxworld
4. memcmp 函数的使用
memcmp - 用于比较两段内存(数组)
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
| | |
| | 要比较的字节数
| 比较者b
比较者a
- 其比较是一个字节一个字节的比较的,遇到不同就会返回
- a > b 时 , 返回 >0
- a < b 时 , 返回 <0
- a 完全等于b , 返回 0
使用:
#include <stdio.h>
#include <string.h>
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}
感谢你能看到这里!!喜欢的话点个👍吧 !,拜托了,这对我真的很重要!!