c语言--内存函数的使用(memcpy、memcmp、memset、memmove)

目录

  • 一、memcpy()
    • 1.1声明
    • 1.2参数
    • 1.3返回值
    • 1.4memcpy的使用
    • 1.5memcpy模拟使用
    • 1.6注意
  • 二、memmove()
    • 2.1声明
    • 2.2参数
    • 2.3返回值
    • 2.4使用
    • 2.5memmove()模拟实现
  • 三、memset
    • 3.1声明
    • 3.2参数
    • 3.3返回值
    • 3.4使用
  • 四、memcmp()
    • 4.1声明
    • 4.2参数
    • 4.3返回值
    • 4.4使用
  • 五、注意

一、memcpy()

1.1声明

void *memcpy(void *dest, const void *src, size_t n)

1.2参数

dest – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
src – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。

1.3返回值

该函数返回一个指向目标存储区 str1 的指针。

1.4memcpy的使用

// 将字符串复制到数组 dest 中
#include<stdio.h>
#include<string.h>
int main()
{const char src[50] = "http://www.runoob.com";char dest[50]="****************";memcpy(dest, src, 6);// 将字符串复制到数组 dest 中printf("dest = %s\n", dest);return 0;
}

在这里插入图片描述

1.5memcpy模拟使用

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_memcpy(char* dest, const char* src,size_t n)
{assert(dest && src);char* ret = dest;for (int i = 0; i < n; i++){*(char*)dest = *(char*)src;dest = (char*)dest+1;src = (char*)src+1;}return ret;
}
int main()
{const char src[50] = "http://www.runoob.com";char dest[50]="****************";char* ret=my_memcpy(dest, src, 6);// memcpy模拟实现printf("dest = %s\n", ret);return 0;
}

在这里插入图片描述

1.6注意

函数memcpy从src的位置开始向后复制num个字节的数据到dest指向的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
对于重叠的内存可以用memmove来处理。

二、memmove()

2.1声明

void *memmove(void *str1, const void *str2, size_t n)

2.2参数

str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。

2.3返回值

该函数返回一个指向目标存储区 str1 的指针。

2.4使用

#include<stdio.h>
#include<string.h>
int main()
{char src[] = "http://www.runoob.com";char dest[50] = "**********";memmove(dest, src, 6);printf("dest=%s", memmove(dest,src,6));return 0;
}

2.5memmove()模拟实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_memmove(char* dest, const char* src, size_t n)
{char* ret = dest;if (dest < src){while (n--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while (n--){*(char*)(dest + n) = *(char*)(src + n);dest = (char*)dest + 1;src = (char*)src + 1;}}return ret;
}
int main()
{const char src[50] = "http://www.runoob.com";char dest[50]="****************";char* my_memmoves=my_memmove(dest, src, 6);//memmove模拟实现printf("dest = %s\n", my_memmoves);return 0;
}

在这里插入图片描述

三、memset

3.1声明

void *memset(void *str, int c, size_t n)

3.2参数

str – 指向要填充的内存块。
c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n – 要被设置为该值的字节数。

3.3返回值

该值返回一个指向存储区 str 的指针。

3.4使用

#include <stdio.h>
#include <string.h>int main ()
{char str[50];strcpy(str,"This is string.h library function");puts(str);memset(str,'$',7);puts(str);return(0);
}
运行结果
```c
This is string.h library function
$$$$$$$ string.h library function

在这里插入图片描述

四、memcmp()

4.1声明

int memcmp(const void *str1, const void *str2, size_t n)

4.2参数

str1 -- 指向内存块的指针。
str2 -- 指向内存块的指针。
n -- 要被比较的字节数。

4.3返回值

如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2

4.4使用

#include <stdio.h>
#include <string.h>int main ()
{char str1[15];char str2[15];int ret;memcpy(str1, "abcdef", 6);memcpy(str2, "ABCDEF", 6);ret = memcmp(str1, str2, 5);if(ret > 0){printf("str2 小于 str1");}else if(ret < 0) {printf("str1 小于 str2");}else {printf("str1 等于 str2");}return(0);
}

在这里插入图片描述

五、注意

他们都要包含头文件<string.h>,assert断言也需要包含头文件。
在这里插入图片描述
欧耶!!! 我学会啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】Anaconda安装后打不开jupyter notebook(网页不自动跳出)

文章目录 一、遇到的问题&#xff1a;jupyter notebook网页不自动跳出&#xff08;一&#xff09;输入jupyter notebook命令&#xff08;二&#xff09;手动打开网页 二、解决办法&#xff1a;指定浏览器&#xff08;一&#xff09;找文件 jupyter_notebook_config.py&#xff…

设计模式,简单工厂模式

23种设计模式是基于面向对象的一些编程逻辑思想&#xff0c;无意间看了看《大话设计模式》&#xff0c;我觉得还挺好玩&#xff0c;虽然设计模式我这个阶段确实可以不着急学&#xff0c;但我觉得这些内容挺吸引我的&#xff0c;反正时间也还多&#xff0c;就学着玩玩。而且设计…

Flink 架构深度解析

## 1. 引言 在当今的数据驱动世界中&#xff0c;实时数据处理变得越来越重要。Flink 提供了一个高性能、可扩展的平台&#xff0c;用于构建实时数据分析和处理应用。它支持事件时间处理和精确一次&#xff08;exactly-once&#xff09;处理语义&#xff0c;确保数据的准确性和…

Linux swapon命令教程:如何管理你的交换空间(附案例详解和注意事项)

Linux swapon命令介绍 swapon命令用于启用设备或文件中的交换空间。交换空间是当系统的物理内存不足时&#xff0c;系统会使用的一部分硬盘空间。 Linux swapon命令适用的Linux版本 swapon命令在大多数Linux发行版中都是可用的&#xff0c;包括Debian、Ubuntu、Alpine、Arch…

大模型在天体物理学研究中的辅助作用与案例分析

大模型在天体物理学研究中的辅助作用与案例分析 1. 背景介绍 天体物理学是研究宇宙中各种天体的物理性质和运动规律的科学。随着观测技术的进步&#xff0c;天体物理学家们获得了大量的数据&#xff0c;这些数据往往具有高维度、非线性、非平稳等特点&#xff0c;给传统的数据…

Struts2的工作原理是什么?Struts2中的MVC模式包含哪些核心组件?在Struts2中如何实现转发和重定向?

Struts2的工作原理是什么&#xff1f; Struts2的工作原理主要基于MVC设计模式&#xff0c;它充当Web应用框架的控制器层&#xff08;Controller&#xff09;&#xff0c;负责建立模型与视图之间的数据交互。 具体来说&#xff0c;Struts2的工作流程如下&#xff1a; 启动与加…

自媒体用ChatGPT批量洗稿软件V5.9环境配置/软件设置教程【汇总】

大家好&#xff0c;我是淘小白~ 首先&#xff0c;感谢大家的支持~~ ChatGPT采集洗稿软件V5.9版本更新&#xff0c;此次版本更新修改增加了一些内容&#xff1a; 1、自定义多条指令&#xff0c;软件自动判断指令条数&#xff0c;进行输入 2、增加谷歌浏览多账号轮询&#xf…

ubuntu20.04 安装ros1

详细介绍如何在ubuntu20.04中安装ROS系统&#xff0c;超快完成安装&#xff08;最新版教程&#xff09;_ubuntu安装ros-CSDN博客Ros noetic : XTDrone安装-CSDN博客 gazebo11卸载&#xff0c;安装gazebo9 我的ROS学习日记-环境搭建 - 知乎 需要选择分支 GitHub - ros-simulat…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记18_竞争市场

1. 竞争市场 1.1. 算法、大数据、超级平台的风起云涌似乎预示了市场竞争机制的加速终结&#xff0c;而我们似乎也对这种市场机制的衰退见怪不怪 1.1.1. 它有效节省了消费者的搜寻成本&#xff0c;降低了市场准入壁垒&#xff0c;开辟了市场扩张与准入之间的崭新通道&#xff…

指针空值nullptr(C++11)

c98中的指针空值 在良好的C/C编程习惯中&#xff0c;声明一个变量时最好给该变量一个合适的初始值&#xff0c;否则可能会出现不可预料的错误&#xff0c;比如未初始化的指针。如果一个指针没有合法的指向&#xff0c;我们基本都是按照如下方式对其进行初始化&#xff1a; void…

Spark-Scala语言实战(5)

在之前的文章中&#xff0c;我们学习了如何在scala中定义与使用集合和元组。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#xff08;…

伪分布式部署Hive

文章目录 1 Hadoop 伪分布式安装1 Hive下载2 Hive配置3 安装MySQL JDBC连接器4 连接Hive CLI4.1 初始化数据库4.2 连接Hive 1 Hadoop 伪分布式安装 假设我们已经安装好hadoop伪分布式 1 Hive下载 Hive下载地址 2 Hive配置 Hive伪分布式需要在conf文件夹下修改两个文件&…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。这个时候我们就可以考虑利用继承的技术&#xff0c;减少重复代码 4.6.1继承的基本语法…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云&#xff0c;开发QT5.14.0VTK9.2.0的上位机软件&#xff0c;用于对结构光3D相机进行控制&#xff0c;并接收传输回来的3D数据&#xff0c;显示在窗口中。 配置QT和VTK VTK9.2.0下载源码&#xff0c;用Cmake编译&#xff0c;编译好的VTK9.2.0…

去中心化的 AI 数据供应:认识Grass,参与Grass

去中心化的 AI 数据供应&#xff1a;认识Grass&#xff0c;参与Grass &#x1f44b;&#xff1a;邀请链接☘️&#xff1a;Intro❓&#xff1a;看好Grass和即将推出的L2的原因有哪些&#xff1f;&#x1f4a1;&#xff1a;展望&#x1f50d;&#xff1a;总结 &#x1f44b;&…

说说webpack的构建流程?

文章目录 一、运行流程初始化流程编译构建流程compile 编译make 编译模块build module 完成模块编译 输出流程seal 输出资源emit 输出完成 二、小结参考文献 一、运行流程 webpack 的运行流程是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会…

python学生作业管理系统flask-django-nodejs-php

课题主要分为三大模块&#xff1a;即管理员模块和学生、教师模块&#xff0c;主要功能包括&#xff1a;学生、教师、作业信息、学习模块、教学评价、学习情况等&#xff1b; 关键词&#xff1a;学生作业管理系统&#xff1b;作业信息 目录 摘 要 I Abstrac II 目录 III 1绪论 1…

5.84 BCC工具之tcpretrans.py解读

一,工具简介 tcpretrans工具追踪内核TCP重传函数,以显示这些重传的详细信息。 它专门用于追踪TCP重传事件。在网络通信中,重传是由于数据包丢失、损坏或延迟到达而需要重新发送的情况。tcpretrans通过利用Linux内核中的BPF(Berkeley Packet Filter)机制,能够实时捕获和…

matlab实现机器学习svm

一、目的和要求 1.编程实现SVM训练函数和预测函数&#xff1b; 2.绘制线性和非线性边界&#xff1b; 3.编写线性核函数 二、算法 1.线性svm&#xff1a; 分离超平面&#xff1a;wxb0&#xff0c;对于线性可分的数据集来说&#xff0c;这样的超平面有无穷多个&#xff08;…

ARM32day4

VID_20240319_210515 1.思维导图 2.实现三个LED灯亮灭 .text .global _start _start: 使能GPIO外设时钟 LDR R0,0x50000A28 LDR R1,[R0]使能GPIOE ORR R1,R1,#(0X1<<4)使能GPIOF ORR R1,R1,#(0X1<<5) STR R1,[R0]设置引脚状态 LDR R0,0X50006000 LDR R1,[R0…