String底层函数的实现方式
一、常见的String封装函数
1. strcpy函数的实现
char *strcpy(char *dest, const char *src)
{char *tmp = dest;while ((*dest++ = *src++) != '\0')/* nothing */;return tmp;
}
2. strncpy函数的实现
char *strncpy(char *dest, const char *src, size_t count)
{char *tmp = dest;while (count) {if ((*tmp = *src) != 0)src++;tmp++;count--;}return dest;
}
3. strcat函数的实现
char *strcat(char *dest, const char *src)
{char *tmp = dest;while (*dest)dest++;while ((*dest++ = *src++) != '\0');return tmp;
}
4. strncat函数的实现
char *strncat(char *dest, const char *src, size_t count)
{char *tmp = dest;if (count) {while (*dest)dest++;while ((*dest++ = *src++) != 0) {if (--count == 0) {*dest = '\0';break;}}}return tmp;
}
5. strcmp函数的实现
int strcmp(const char *cs, const char *ct)
{unsigned char c1, c2;while (1) {c1 = *cs++;c2 = *ct++;if (c1 != c2)return c1 < c2 ? -1 : 1;if (!c1)break;}return 0;
}
6. strncmp函数的实现
int strncmp(const char *cs, const char *ct, size_t count)
{unsigned char c1, c2;while (count) {c1 = *cs++;c2 = *ct++;if (c1 != c2)return c1 < c2 ? -1 : 1;if (!c1)break;count--;}return 0;
}
7. strlen函数的实现
size_t strlen(const char *s)
{const char *sc;for (sc = s; *sc != '\0'; ++sc)/* nothing */;return sc - s;
}
8. strnlen函数的实现
size_t strnlen(const char *s, size_t count)
{const char *sc;for (sc = s; count-- && *sc != '\0'; ++sc)/* nothing */;return sc - s;
}
9. memset函数的实现
void *memset(void *s, int c, size_t count)
{char *xs = s;while (count--)*xs++ = c;return s;
}
10. memcpy函数的实现
void *memcpy(void *dest, const void *src, size_t count)
{char *tmp = dest;const char *s = src;while (count--)*tmp++ = *s++;return dest;
}
二、内存重叠问题
memcpy函数将src的字节数复制到dest。如果源和目标重叠,这个函数不能确保重叠区域的原始源字节在被覆盖之前被复制。
一. 高地址向低地址进行拷贝
由于在虚拟地址空间中,栈空间的生长方向是高地址向低地址生长,首先采用这种方式。简略的讲就是源字符串中的字符从前往后向目标字符串按给定字节的大小依此进行拷贝。
观察上图,可以得到两个合理的区间即不会出现内存覆盖的区间。
(1)dest<=src
第一种情况dest=src,此时源字符串与目标字符串指针指向同一个位置,拷贝的过程相当自己给自己赋值,因此拷贝结束 后源字符串并没有发生变化。
第二种情况dest < src,这样的拷贝尽管会覆盖src的内容,出现了内存重叠,但其可以完成内存拷贝的功能,并没有将错误的信息拷贝过来。
(2)dest>=src+n
当dest>=src+n,无论如何都不会出现内存重叠的问题。
二. 低地址向高地址拷贝
(3)src<dest<src+n (内存重叠)
为了避免出现这种情况,我们可以将src和dest都移动 n-1个位置,这样我们就可以从地址值向高地址进行拷贝,这样尽管也有可能目标字符串覆盖源字符串的情况,但是定影可以得到一个正确的拷贝。
- memove可以避免内存拷贝时的重叠问题。
- 实际上,memcpy只是memmove的一个子集。
- memcpy比memmove的速度要快一些。
void *memmove(void *dest, const void *src, size_t count)
{char *tmp;const char *s;if (dest <= src) {tmp = dest;s = src;while (count--)*tmp++ = *s++;} else {tmp = dest;tmp += count;s = src;s += count;while (count--)*--tmp = *--s;}return dest;
}
相关文章:
String底层函数的实现方式
一、常见的String封装函数 1. strcpy函数的实现 char *strcpy(char *dest, const char *src) {char *tmp dest;while ((*dest *src) ! \0)/* nothing */;return tmp; } 2. strncpy函数的实现 char *strncpy(char *dest, const char *src, size_t count) {char *tmp dest…...

uniapp实现微信小程序全局可分享功能
uniapp实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】 主要使用 Vue.js 的 全局混入 1.创建一个全局分享的js文件。示例文件路径为:./utils/shareWx.js ,在该文件中定义全局分享的内容: export default {data() {retur…...

大数据成为市场营销利器 ,促进金融贷款企业获客精准化
随着大数据技术的不断普及,中国对尖端技术和云计算技术的投资大幅增加。大数据、云计算技术、物联网等一系列新一代信息技术也加速完善。 目前,大数据技术也非常成熟,大数据的应用领域也多种多样。大数据的重要方面“运营商大数据”已经被政…...
Acwing 3472. 八皇后
题目如下: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。 如何将 88 个皇后放在棋盘上(有 88 个方格),使它们谁也不能被吃掉! 这就是著名的八皇后问题。 对于某个满足要…...

Word转为PDF后图片模糊怎么办?Word转为PDF的技巧介绍
将Word文档转为PDF是我们日常办公和文档处理中常见的需求。PDF格式的优势在于跨平台兼容性、保留原始格式、文档保护以及方便共享和分发等方面。本文将探讨Word转为PDF后图片模糊怎么办?Word转为PDF的技巧有哪些?通过这些问题的答案,可以帮助您更好的利用文件转换…...

【django开发手册】详解drf filter中DjangoFilterBackend,SearchFilter,OrderingFilter使用方式
💖 作者简介:大家好,我是Zeeland,开源建设者与全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客:Zeeland📚 Github主页: Undertone0809 (Zeeland)&…...

3D开发工具HOOPS Publish如何快速创建交互式3D PDF文档?
HOOPS Publish是一款功能强大的SDK,可以创作丰富的工程数据并将模型文件导出为各种行业标准格式,包括PDF、STEP、JT和3MF。HOOPS Publish核心的3D数据模型是经过ISO认证的PRC格式(ISO 14739-1:2014),它为装配树、拓扑和几何、产品制造信息和视…...
【Kafka】ZooKeeper启动失败报错java.net.BindException: Address already in use: bind
问题描述 Kafka 2.8.1 ZooKeeper启动失败。 zookeeper-server-start.bat ../../config/zookeeper.properties[2023-09-04 18:21:49,497] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory) [2023-09-04 18:21:49,498] ERROR Un…...

系统架构设计师-计算机系统基础知识(1)
目录 一、嵌入式系统概述 1、基本概念 2、嵌入式系统软件组成架构 二、嵌入式软件开发 三、嵌入式硬件 1、嵌入式微处理器 一、嵌入式系统概述 1、基本概念 (1)嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软、硬件…...

Mediasoup在node.js下多线程实现
mediasoup基于socket.io的交互消息来完成join-room的请求过程。Join的过程,实际就是获取stream的过程,也就是视频加载时间(video-load-speed)。在RTMP系统,视频加载时间是秒开。Mediasoup给出的第一个frame是I-frame,但由于交互的…...

一文入门Web网站安全测试
文章目录 Web网页安全风险评估1. 数据泄漏2. 恶意软件传播3. 身份伪装和欺诈 测试Web网页的安全性常见方法和工具漏洞扫描器手动漏洞测试漏洞利用工具Web应用程序防火墙(WAF)测试渗透测试代码审查社会工程学测试 推荐阅读 Web网页安全风险评估 越来越多…...
Django REST framework中的序列化Serializers
序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。 简单来…...

LeetCode 剑指 Offer 10- I. 斐波那契数列
LeetCode 剑指 Offer 10- I. 斐波那契数列 题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) 0, F(1) 1 F(N) F(N - 1) F(N - …...
Css 将某div设置为透明,但其子元素不透明
可以使用css中的属性opacity来设置元素的透明度,但它会影响到元素的所有子元素。如果想让父元素透明,但子元素不透明,可以使用另外一种方法: 首先,将父元素的背景颜色设置为rgba格式,其中a表示透明度。例如…...
17 | Spark中的map、flatMap、mapToPair mapvalues 的区别
在Apache Spark中,map、flatMap、mapToPair和mapValues是用于对RDD(Resilient Distributed Dataset)进行转换的不同操作。这些操作可以用来处理分布式数据集中的元素,但它们的用途和行为略有不同。 以下是它们的主要区别以及相应的Java代码示例: map:map操作用于对RDD中…...

手写Mybatis:第9章-细化XML语句构建器,完善静态SQL解析
文章目录 一、目标:XML语句构建器二、设计:XML语句构建器三、实现:XML语句构建器3.0 引入依赖3.1 工程结构3.2 XML语句构建器关系图3.3 I/O资源扫描3.4 SQL源码3.4.1 SQL对象3.4.2 SQL源码接口3.4.3 原始SQL源码实现类3.4.4 静态SQL源码实现类…...

云原生Kubernetes:Kubeadm部署K8S单Master架构
目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm,kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 …...

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显…...

开发指导—利用 CSS 动画实现 HarmonyOS 动效(二)
注:本文内容分享转载自 HarmonyOS Developer 官网文档 点击查看《开发指导—利用CSS动画实现HarmonyOS动效(一)》 3. background-position 样式动画 通过改变 background-position 属性(第一个值为 X 轴的位置,第二个…...

音频修复和增强工具 iZotope RX 10 for mac激活最新
iZotope RX 10是一款音频修复和增强软件,主要特点包括: 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...