【C语言】这些实用的内存函数你掌握了吗?

简介: 🚀🚀前言大家好,本文主要深度讲解内存函数的细节,并且对部分常用函数做出模拟实现,收录到C—语法专栏,定期更新C语言语法方面知识,都是比较详细的,自己复习的同时也希望能帮助到大家,如果有不对或者不足的地方欢迎评论区补充。

本章重点:

重点介绍常用处理字符串的库函数的使用以及注意事项,并且模拟实现,便于更深刻的理解下列函数。

memcpy() 求字符串长度

memmove() 复制字符串

memcmp() 比较两个字符串大小

一、memcpy()

void * memcpy ( void * destination, const void * source, size_t num );

用于从source开始拷贝num个字节到destination的内存位置

注意事项

  • 如果source与destination有重叠会出现数据重叠问题,memmove很好的避免了这点

🍅模拟实现

void* my_memcpy(void* s1, void* s2,int num)
{
  assert(s1 && &s2);
  void* ret = s1;
  while (num--)
  {
    *(char*)s1 = *(char*)s2;
    s1 = (char*)s1 + 1;
    s2 = (char*)s2 + 1;
  }
  return ret;
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  my_memcpy(arr2, arr, 17); //注意:这里传入17个字节,注意输出内容
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", arr2[i]);//因为是小端字节序所以arr2是1 2 3 4 5 0 0 0 0 0 
  }
}

二、memmove()

void * memmove ( void * destination, const void * source, size_t num );

用于从source移动num个字节到destinaton

注意事项

  • 可以处理source与destination有重叠的情况

🍎模拟实现

//模拟实现memmove
void* my_memmove(void* s1,const void* s2,size_t num)
{
  assert(s1 && s2);
  void* ret = s1;
  if (s1 < s2)
  {
    while (num--)
    {
      *((char*)s1 +num) = *((char*)s2 + num);
    }
  }
  else
  {
    while (num--)
    {
      *(char*)s1 = *(char*)s2;
      s1 = (char*)s1 + 1;
      s2 = (char*)s2 + 1;
    }
  }
  return ret;
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
  int arr2[] = { 8,8,8,8,8,8,8,8,8,8,8 };
  my_memmove(arr, arr+3,12);
  for (int i = 0; i < 10; i++)
  {
    printf("%d", arr[i]);
  }
}

三、memcmp()

int memcmp ( const void * ptr1,const void * ptr2,size_t num );


比较从ptr1和ptr2开始的num个字节


ptr1>ptr2 return >0的数字


ptr1=ptr2 return =0


ptr1<ptr2 return<0的数字

🦀函数用法

#include<stdio.h>
#include<string.h>
int main() {
  char str1[] = "haohaoxuexa";
  char str2[] = "haohaoxuexi";
  if (memcmp(str1, str2, strlen(str1)) == 0)    //=0
  {
    printf("str1 and str2 are same\n");
  }
  else if (memcmp(str1, str2, strlen(str1)) < 0)    //<0
  {
    printf("str1 is less than str2\n");
  }
  else
  {
    printf("str1 is greater than str2\n");    //>0
  }
  return 0;
}

完结

创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐


d89241b7267e47efa46e331647af0e19.gif














相关文章
|
13天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
24 0
|
15天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
28 0
|
1天前
|
编译器 C语言
字符串与内存函数
字符串与内存函数
11 0
|
13天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
35 0
|
20天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
20天前
|
机器学习/深度学习 C语言
【C语言】函数的系统化精讲(三)1
【C语言】函数的系统化精讲(三)
|
20天前
|
编译器 C语言
【C语言】函数的系统化精讲(一)2
【C语言】函数的系统化精讲(一)2
|
20天前
|
编译器 Serverless C语言
【C语言】函数的系统化精讲(一)1
【C语言】函数的系统化精讲(一)
|
20天前
|
存储 程序员 编译器
【C语言第二回】main、printf和库函数
【C语言第二回】main、printf和库函数
|
24天前
|
编译器 C语言 C++
【C语言】calloc()函数详解(动态内存开辟函数)
【C语言】calloc()函数详解(动态内存开辟函数)
25 0