我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
#memset
这个库函数作用是将s位置开始的n个字节内容全部改为c
#include <stdio.h> #include <string.h> typedef struct stu { char name[8]; int age; }stu; void Init(stu a[]) { memset(a, 0, sizeof(a[0]) * 6); } int main() { stu a[6]; Init(a); return 0; }
那么是否初始化了呢?看截图:
很好,全部初始化为0了 ,这个函数在初始化多个数据,类似结构体和数组时出奇的好用,推荐。
#memcpy
这个memcpy库函数作用是 将source位置开始向后的num个字节的内容复制到destination位置对应的内存里。
memcpy和strncpy不同之处在于,memcpy可以拷贝任意类型的数据,而strncpy只能拷贝字符。
同时memcpy要求source和destination不可以有重叠的部分,也就是说,不能自己拷贝自己,任何空间内存的重叠都不可以。
虽然说VS2022中memcpy实现了重叠部分也可以拷贝的功能,但是不保证其他编译器会实现,因为对这个函数的标准要求就是实现了不重叠部分的拷贝就可以。
#include <stdio.h> #include <string.h> int main() { int arr1[10] = { 1,2,3,4,5,6 }; int arr2[10] = { 7,8,9 }; memcpy(arr1, arr2, 12); for (int i = 0; i < 6; i++) { printf("%d ",arr1[i]);; } return 0; }
接下来我们来模拟实现它
#include <stdio.h> #include <string.h> #include <assert.h> void* my_memcpy(void* arr1, const void* arr2, size_t num) { void* ret = arr1; assert(arr1 && arr2); while (num--) { *(char*)arr1 = *(char*)arr2; arr1 = (char*)arr1 + 1; arr2 = (char*)arr2 + 1; } return ret; } int main() { int arr1[10] = { 1,2,3,4,5,6, }; int arr2[10] = { 7,8,9 }; my_memcpy(arr1, arr2, 12); for (int i = 0; i < 6; i++) { printf("%d ",arr1[i]);; } return 0; }
#memmove
memmove对他的要求就是同时实现重叠和不重叠部分的拷贝,这在哪个编译器上都一样,所以在使用内存拷贝函数的时候,最好使用memmove,功能同上。
#memcmp
比较从ptr1和ptr2开始的num个字节,返回值和比较方法同strcmp,前面的章节中我们讲过,也模拟实现过, 这里不多赘