你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)

简介: 我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。

我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。


#memsetde5bc07ab3724125a9170d1d01cc7182.png

这个库函数作用是将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;
}


那么是否初始化了呢?看截图:

41af00cba9284d37b492a41d95c19f3c.png

很好,全部初始化为0了 ,这个函数在初始化多个数据,类似结构体和数组时出奇的好用,推荐。


#memcpy

399e46dd6b6c4a75a7135c733b902177.png

36131b9ce6dd4cc4a31f07f35ad70005.png

这个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

96e547fa72bc4590a189d5ab338ddc1c.png

memmove对他的要求就是同时实现重叠和不重叠部分的拷贝,这在哪个编译器上都一样,所以在使用内存拷贝函数的时候,最好使用memmove,功能同上。


#memcmp

cda6080194e840be9613308eee42c3dd.png

比较从ptr1和ptr2开始的num个字节,返回值和比较方法同strcmp,前面的章节中我们讲过,也模拟实现过, 这里不多赘


#下期预告

qsort函数的介绍使用和模拟实现



目录
相关文章
|
1月前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
25 3
|
29天前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法
|
2月前
|
C语言
C语言实现memcpy,memmove
C语言实现memcpy,memmove
22 0
|
2月前
|
程序员 C语言
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
16 0
|
6天前
|
C语言
C语言5 字符输出函数和格式输出函数
C语言5 字符输出函数和格式输出函数
13 1
|
8天前
|
算法 编译器 C语言
深入浅出C语言—【函数】下
深入浅出C语言—【函数】下
|
20天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数
|
23天前
|
C语言
C语言prinf函数
C语言prinf函数
14 4
|
21天前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
16 1
|
23天前
|
编译器 程序员 Serverless
函数(C语言)
函数(C语言)