C++|动手实现strcpy、memcpy、memmove

strcpy

手写一个字符串拷贝函数:

char* my_strcpy(char* dest, const char* src) {char* dest_ptr = dest;while (*src != '\0') *dest_ptr++ = *src++;*dest_ptr = '\0';return dest;
}
  1. 确定好函数原型,函数返回目标字符串 dest 的地址,复制原字符串const char *src到目标字符串char* dest
  2. 保存目标地址的起始位置:保存其实位置,因为我们待会儿还得把他返回呢。
  3. 逐字符复制:有个小技巧*dest_ptr = *src++;
  4. 添加空字符结尾:千万别忘
  5. 返回目的地址:return dest

memcpy

如果源内存区域和目的内存区域有重叠,memcpy 的行为是未定义的。在这种情况下,应该使用 memmove 函数,它能够正确处理重叠的内存区域。

memcpy 的使用场景一般在初始化数组、复制结构体或对象等。

void* my_memcpy(void* dest, const void* src, size_t count) {if (dest == NULL || src == NULL) return NULL;char* d = (char*)dest;char* s = (char*)src;while (count--) {*d++ = *s++;}return dest;
}
  1. 函数原型:需要注意的是,内存区域可能是任何类型
  2. 空哦指针检查
  3. 类型转换,都转换为char*类型,以便逐字节操作内存
  4. 逐字节复制
  5. 返回目标地址

memmove

memmove主要就是为了解决内存重叠现象。在内存重叠时我们应该使用memmove,因为它从后向前拷贝,可以避免任何src和dest的重叠情况下的内存数据拷贝。

#include <stddef.h> // for size_tvoid* my_memmove(void* dest, const void* src, size_t count) {if (dest == NULL || src == NULL) return NULL; // 检查空指针char* d = (char*)dest;const char* s = (const char*)src;if (d < s) {// 如果目标地址在源地址之前,可以从前往后复制while (count--) {*d++ = *s++;}} else {// 如果目标地址在源地址之后,从后往前复制d += count;s += count;while (count--) {*(--d) = *(--s);}}return dest;
}

memmove、memcpy源代码

/* Public domain.  */
#include <stddef.h>void *
memcpy (void *dest, const void *src, size_t len)
{char *d = dest;const char *s = src;while (len--)*d++ = *s++;return dest;
}//* Public domain.  */
#include <stddef.h>void *
memmove (void *dest, const void *src, size_t len)
{char *d = dest;const char *s = src;if (d < s)while (len--)*d++ = *s++;else{char *lasts = s + (len-1);char *lastd = d + (len-1);while (len--)*lastd-- = *lasts--;}return dest;
}

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

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

相关文章

069.餐饮案例:背广告词吃饭免单 餐厅年入百万

069.餐饮案例&#xff1a;背广告词吃饭免单 餐厅年入百万 时间: 2024-5-26 分类: 营销流量 作者: admin 0 次浏览 069.餐饮案例&#xff1a;背广告词吃饭免单 餐厅年入百万 背广告词吃饭免单 小餐馆巧计提人气 2007 年&#xff0c;如同许多创业者一样&#xff0c;郑州女孩韩月遭…

2024年5月LLM最新排名:GPT-4o出道即巅峰!国内3个大模型榜上有名!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

上位机图像处理和嵌入式模块部署(f103 mcu的最小软件系统)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道mcu电路有最小系统。一个最小硬件系统里面包含了mcu、晶振、复位、输入和输出。其实不光硬件如此&#xff0c;软件也有一个最小系统。而…

颜色值进制转换

颜色值进制转换 专业的和非专业程序员在编程时都碰到过颜色值的表达式。特别是在编制网页和设计界面时&#xff0c;都要选择颜色。各语言的颜色值表达式就两种&#xff0c;十六进制的颜色值hex$和十进制的RGB格式。现成的调色板颜色表也是这两种格式。写代码时会遇到写颜色值码…

打造有情感的AI智能体-情感问答

目录 文心智能体平台简介 情感问答智能体介绍 优势1主动提问深入分析你的困扰&#xff0c;合理建议 优势2多次主动提问&#xff0c;引导用户补全信息。 优势3整合多种强大工具 最近发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c…

04.爬虫---Session和Cookie

04.Session和Cookie 1.Session2.Cookie3.详细对比4.Cookie属性结构5.一些误区 Session和Cookie是Web开发中用于用户状态管理的两种常见技术。理解它们的区别对于开发安全的Web应用至关重要。 1.Session Session代表服务器与客户端的一次会话过程。服务器端存储了Session对象&…

重生奇迹MU格斗家上手最轻松的职业

重生奇迹MU格斗家玩法攻略&#xff0c;有一个比较奇葩的职业&#xff0c;那就是格斗家。格斗家拥有其他职业没有的优势&#xff0c;就是加体力和敏捷都可以提升攻击力百分比。格斗家玩法攻略 目前格斗家最多的就是敏格玩法&#xff0c;配合智力MM加成后的幽冥光速拳可以说是第…

中国电子学会(CEIT)2023年09月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试四级 2023年09月 编程题四道 总分:100分一、酒鬼(25分) Santo刚刚与房东打赌赢得了一间在New Clondike的大客厅。今天,他来到这个大客厅欣赏他的奖品。 房东摆出了一行瓶子在酒吧上。瓶子…

调用其他程序(不用import call tranction)

ABAP cl_salv_bs_runtime_info 读取其他程序显示的ALV-CSDN博客

react-beautiful-dnd 横纵排序demo

简单导入就可以看到效果 1. 安装依赖 npm i react-beautiful-dnd 2. 纵向排序 import React, { useState } from react; import { DragDropContext, Droppable, Draggable } from react-beautiful-dnd;// 纵向排序 const reorder (list, startIndex, endIndex) > {con…

v-rep---script-function

作用&#xff0c;实现&#xff0c;参数讲解。 script-function标签 作用 问题&#xff1a;如何在插件的接口中调用lua脚本中定义的函数&#xff1f; 用于声明一个函数&#xff0c;这个函数的作用是通过v-rep提供的接口sim::callScriptFunctionEx()调用脚本的函数&#xff0…

专业的力量:在自己的领域成为专家

专业的力量:在自己的领域成为专家 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 现在稀缺的已不再是信息资源&#xff0c;而是运用信息的能力。过去的海…

Android 第三方框架:图片加载:Glide:功能介绍

文章目录 网络加载 网络加载方案 方案一:默认基于HttpUrlConnection方案二:提供与Google Volley和Square OkHttp快速继承的工具库网络优化方案 方案一:绑定生命周期,停止不必要的加载方案二:提供同步加载和异步加载图片解码 图片解码方案 方案一:系统提供的BitmapFactory…

Python中的单例模式:原理、实现与应用

Python中的单例模式&#xff1a;原理、实现与应用 一、引言 在软件开发中&#xff0c;设计模式是一种用于解决常见问题的最佳实践。单例模式&#xff08;Singleton Pattern&#xff09;是这些设计模式中的一种&#xff0c;它确保一个类仅有一个实例&#xff0c;并提供一个全局…

深入了解Nodejs模块机制

深入了解Nodejs模块机制 我们都知道Nodejs遵循的是CommonJS规范&#xff0c;当我们require(moduleA)时&#xff0c;模块是怎么通过名字或者路径获取到模块的呢&#xff1f;首先要聊一下模块引用、模块定义、模块标识三个概念。 1 CommonJS规范 1.1 模块引用 模块上下文提供…

安装部署统信UOS服务器操作系统1070e

原文链接&#xff1a;安装部署统信UOS服务器操作系统1070e Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于安装部署统信UOS服务器操作系统1070e的文章。统信UOS是一款基于Linux的国产操作系统&#xff0c;以其安全性和稳定性受到广泛关注。本文将详细介绍如何安…

58同城如何降低 80%的机器成本 | OceanBase案例

本文作者&#xff1a;58同城架构师刘春雷 一、背景介绍 58同城作为中国互联网生活服务领域的领军者&#xff0c;其平台规模居国内之首&#xff0c;涵盖了包括车辆交易、房产服务、人才招聘、本地生活服务以及金融等多元化的业务场景。 因其业务的广泛性和多样性&#xff0c;我…

飞天使-linux操作的一些技巧与知识点11-升级jenkins 版本

文章目录 升级jenkins 升级jenkins [rootgcp-hongkong-test-git ~]# cd /usr/share/java/ [rootgcp-hongkong-test-git java]# ll total 360004 -rw-r--r-- 1 root root 93489042 Apr 17 23:00 jenkins.war主要是去官网找到这个包&#xff0c;然后替换&#xff0c;重启jenkins…

Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?

通过前面几个课时的学习&#xff0c;相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化&#xff0c;这样就会对 JVM 的知识点有一个完整的认识&#xff0c;从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…