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

news2024/9/23 22:46:11

目录

  • 一、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.coloradmin.cn/o/1545193.html

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

相关文章

mysql增量备份与修复

MySQL数据库增量恢复 1.一般恢复 将所有备份的二进制日志内容全部恢复 2.基于位置恢复 数据库在某一时间点可能既有错误的操作也有正确的操作 可以基于精准的位置跳过错误的操作 发生错误节点之前的一个节点&#xff0c;上一次正确操作的位置点停止 3.基于时间点恢复 跳过…

群晖NAS安装Video Station结合内网穿透实现公网访问本地影音文件

文章目录 1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端&#xff08;搭载安卓&#xff0c;ios&#xff0c;ipados等系统的设备…

宽光谱SOA光芯片设计(一)

-本文翻译自由Geoff H. Darling于2003年撰写的文章。尽管文章较早&#xff0c;但可以了解一些SOA底层原理&#xff0c;并可看到早期SOA研究的思路和过程&#xff0c;于今仍有很高借鉴价值。 摘要 本文介绍一种新型宽光谱半导体光放大器&#xff08;SOA&#xff09;技术&#x…

学成在线项目学习

技术栈 学成在线服务端基于Spring Boot构建&#xff0c;采用Spring Cloud微服务框架。 持久层&#xff1a;MySQL、MongoDB、Redis、ElasticSearch 数据访问层&#xff1a;使用Spring Data JPA 、Mybatis、Spring Data Mongodb等 业务层&#xff1a;Spring IOC、Aop事务控制、S…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅲ)

1.连接查询 连接查询&#xff1a;同时涉及多个表的查询 连接条件或连接谓词&#xff1a;用来连接两个表的条件 一般格式&#xff1a; [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [&l…

由浅到深认识Java语言(25):正则表达式

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

相机显示储存卡未格式化怎么回事?怎么办

在摄影的学习和实践中&#xff0c;相机是我们记录美好瞬间的得力助手。然而&#xff0c;当相机突然提示储存卡未格式化时&#xff0c;这往往会让我们感到困惑和焦虑。本文将探讨相机显示储存卡未格式化的可能原因&#xff0c;并提供相应的解决方案。 图片来源于网络&#xff0c…

腾讯云优惠券获取方式及领取入口详解

随着云计算的普及&#xff0c;腾讯云作为国内领先的云计算服务提供商&#xff0c;受到了越来越多企业和个人的青睐。为了降低用户的使用成本&#xff0c;腾讯云推出了各种优惠券&#xff0c;让用户在享受优质服务的同时&#xff0c;还能获得更多实惠。本文将为大家详细介绍腾讯…

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

AI预测福彩3D第18弹【2024年3月26日预测--第4套算法重新开始计算第4次测试】

昨天对第4套算法进行了第三次测试&#xff0c;其中第一套方案成功命中&#xff0c;目前第4套算法的预测战绩为3次测试2次命中。测试的目的主要是为了记录统计两套方案的稳定性和命中率。今天继续对第4套算法进行测试&#xff0c;今天是第4次测试&#xff0c;同样测试两个方案。…

【新手小白教程】2024最新:如何轻松订阅Patreon及其支付、充值全攻略

前言 什么是Patreon Patreon是一个极具创新性的在线平台&#xff0c;它为内容创作者提供了一个独特的机会&#xff0c;使他们能够直接通过订阅服务模式从粉丝那里获得资金支持或打赏。 这个平台吸引了各种类型的创作者&#xff0c;包括艺术家、音乐家、作家、视频制作人等&…

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址&#xff1a;RedisInsight | The Best Redis GUI github开源地址&#xff1a;GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

力扣热门算法题 102. 二叉树的层序遍历,104. 二叉树的最大深度,110. 平衡二叉树

102. 二叉树的层序遍历&#xff0c;104. 二叉树的最大深度&#xff0c;110. 平衡二叉树&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.25 可通过leetcode所有测试用例。 目录 102. 二叉树的层序遍历 解题思路 完整代码 Jav…

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎&#xff0c;是一种与 Hadoop 相似的开源集群计算环境&#xff0c;但是两者之间还存在一些不同之处&#xff0c;这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…

项目风险管理:从识别到应对

在项目启动阶段&#xff0c;应制定风险管理计划&#xff1b;在项目执行阶段&#xff0c;应定期进行风险审查和评估&#xff1b;在项目收尾阶段&#xff0c;应对风险管理进行总结和反思。 如何减少和规避风险&#xff1f; 我们可以学习和借鉴类似项目的经验&#xff0c;了解过…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 一、简单介绍 二、简单图像浮雕效果实现原理 三、简单图像浮雕效果案例实现简单步骤 四、注…

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现&#xff1a; 城市交通问题直接影响市民的生活和工作。在地形平坦的城市&#xff0c;公共自行车出行系统是一种很好的辅助手段。一般来说&#xff0c;公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

数据本地性如何助力企业在云上实现高效机器学习

分享嘉宾&#xff1a; Lu Qiu, Shawn Sun 本文将讨论数据本地性对于在云上进行高效机器学习的重要性。首先对比现有解决方案的利弊&#xff0c;并综合考虑如何通过数据本地性来降低成本和实现性能最大化。其次会介绍新一代的Alluxio设计与实现&#xff0c;详细说明其在模型训练…

生命源集团2024全球品牌发布会成功举办

生命源集团2024全球品牌发布会圆满落幕 3月20日&#xff0c;生命源集团在杭州隆重举办了主题为“生命源启&#xff0c;荣耀之巅”的2024全球品牌发布会。 活动伊始&#xff0c;嘉宾们陆续签到入场&#xff0c;现场气氛热烈而庄重。随后&#xff0c;生命源集团十二大事业部总裁…