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个位置,这样我们就可以从地址值向高地址进行拷贝,这样尽管也有可能目标字符串覆盖源字符串的情况,但是定影可以得到一个正确的拷贝。

  1. memove可以避免内存拷贝时的重叠问题。
  2. 实际上,memcpy只是memmove的一个子集。
  3. 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;
}

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

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

相关文章

安卓Termux搭建web服务器【公网远程手机Android服务器】

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的Linux 环境&#xff0c;能够实现Linux下的许多基本操作&#xff0c;不需要root权限Termux就…

国产集成开发环境工具 CEC-IDE

本周&#xff0c;国内首款适配国产操作系统、自主可控的集成开发环境工具 CEC-IDE 终于开放下载了。公开报道显示&#xff0c;这款集成开发环境工具由数字广东公司联合麒麟软件打造&#xff0c;于今年 6 月份首次亮相。本周&#xff0c;软件上线仅几天内就在知乎和 GitHub 上引…

基于springboot绩效管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

机器学习笔记 - 什么是多模态深度学习?

一、概述 人类使用五种感官来体验和解释周围的世界。我们的五种感官从五种不同的来源和五种不同的方式捕获信息。模态是指某事发生、经历或捕捉的方式。 人工智能正在寻求模仿人类大脑,终究是跳不出这具躯壳的限制。 人脑由可以同时处理多种模式的神经网络组成。想象一下进行对…

Jetpack业务架构—四件套(Lifecycle、ViewModel、LiveData、DataBinding)

Jetpack 是一个由多个库组成的套件&#xff0c;可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码&#xff0c;让开发者可将精力集中于真正重要的编码工作。 Android Jetpack组件的优势&#xff1a; Jetpack推出的主要目的是为了能够…

微服务容错 Resilience4j 接口服务-容错原理

微服务容错 Resilience4j 容错原理 4.1 微服务容错简介 在⾼并发访问下&#xff0c;⽐如天猫双11&#xff0c;流量持续不断的涌⼊&#xff0c;服务之间的相互调⽤频率突然增加&#xff0c;引发系统负载过⾼&#xff0c;这时系统所依赖的服务的稳定性对系统的影响⾮常⼤&#…

0301yarnmapredude入门-hadoop-大数据学习

文章目录 1 MapReduce概述2 YARN2.1 yarn概述2.2 yarn与MapReduce关系2.3 yarn架构2.4 辅助角色 3 MapReduce & YARN部署3.1 集群规划3.2 配置文件3.3 分发配置文件 4 体验4.1 集群启动命令介绍4.2 提交MapReduce任务到YARN执行 结语 1 MapReduce概述 分布式计算是一种计算…

过滤器的应用-Filter

过滤器 1.工作原理 2.创建Filter 2.1通过注解的方式实现 //创建一个类&#xff0c;实现Filter接口 WebFilter(urlPatterns "/myfilter") //urlPatterns表示需要拦截的路径 public class MyFilter implements Filter {Overridepublic void doFilter(ServletReques…

WebRTC音视频通话-WebRTC推拉流过程中日志log输出

WebRTC音视频通话-WebRTC推拉流过程中日志log输出 之前实现iOS端调用ossrs服务实现推拉流流程。 推流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132262724 拉流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132417602 在推拉流过程中的…

并发-Java中的锁(四)---LockSupport工具,Condition

LockSupport工具 当需要阻塞或唤醒一个线程的时候&#xff0c;都会使用LockSupport工具类来完成相应工作定义了一组公共静态方法&#xff0c;提供了最基本的线程阻塞和唤醒功能定义了一组以park开头的方法用来阻塞当前线程&#xff0c;unpark方法来唤醒一个被阻塞线程 void pa…

ssh 基本用法与免密登录

基本用法 远程连接服务器&#xff1a; ssh userhostname user&#xff1a;用户名hostname&#xff1a;IP地址或域名 举个例子&#xff0c;假设我们的user是tom&#xff0c;hostname是123.45.67.890 可以输入&#xff1a;ssh tom123.45.67.890 第一次登陆时会提示&#xff1a…

arm64架构的linux中断分析

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 3. GICv3中断控制器3.1 GICv3中断控制器设备树3.2 GICv3中断控制器驱动 4. GIC的下一级中断控制器4.1 设备树4.2 内核对设备树的处理…

大数据学习:Hive常用函数

Hive常用函数 1. Hive的参数传递 1.1 Hive命令行 查看hive命令的参数 [hadoopnode03 ~]$ hive -help语法结构: hive [-hiveconf xy]* [<-i filename>]* [<-f filename>|<-e query-string>][-S] 说明&#xff1a; -i 从文件初始化HQL。-e从命令行执行指定…

线性代数的学习和整理16:什么是各种空间(类型),向量空间,距离(类型)?

目录 1 空间相关的群&#xff0c;环&#xff0c;域&#xff0c;集合&#xff0c;空间的预备知识 1.1&#xff1a;群&#xff0c;环&#xff0c;域&#xff0c;集合&#xff0c;空间的定义&#xff08;表示不懂&#xff0c;只是做个标记&#xff09; 2 空间 2.1 各种空间概念…

WebRTC-Streamer交叉编译

WebRTC-Streamer交叉编译 flyfish 文章目录 WebRTC-Streamer交叉编译零、前言一、提前准备工作1 安装需要的工具2 可选的交叉编译工具3 默认执行python是python34 获取源码5 使用其他版本的方法 二、非交叉编译编译1 在 src目录执行 安装所需的依赖2 执行命令 三、 交叉编译1 …

css如何给盒子底部加阴影,CSS3 --添加阴影(盒子阴影、文本阴影的使用)

CSS3 - 给div或者文字添加阴影(盒子阴影、文本阴影的使用) CSS3定义了两种阴影&#xff1a;盒子阴影和文本阴影。其中盒子阴影需要IE9及其更新版本&#xff0c;而文本阴影需要IE10及其更新版本。下面分别介绍两种阴影的使用&#xff1a; 1&#xff0c;盒子阴影 (1)盒子阴影的…

Java-集合-ConcurrentHashMap

table&#xff1a;数组加volatile保证可见性和有序性 put()&#xff1a;数组不存在&#xff0c;通过CAS创建&#xff1b;数组下标位置为空&#xff0c;通过CAS插入&#xff1b;数组下标位置不为空&#xff0c;给头节点加synchronized来插入链表或红黑树 面试题 ConcurrentHas…

【Linux】redhat7.8配置yum在线源【redhat7.8镜像容器内配置yum在线源】通用

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【车载以太网测试从入门到精通】——DoIP BootLoader刷写测试(含CAPL源码)

系列文章目录 文章目录 系列文章目录前言一、DoIP刷写环境搭建二、DoIP刷写工程使用方法三、DoIP刷写CAPL源码四、刷写工程下载链接前言 DoIP概述: DoIP(Diagnostic communication over InternetProtocol),基于IP网络的汽车诊断协议。DoIP技术可实现本地诊断、远程诊断、空…

Navicat 强大的数据模型功能 | 面向数据库设计、架构和数据资产梳理等使用场景

数据模型是用来描述数据、组织数据和对数据进行操作的一组概念和定义。根据不同的应用需求&#xff0c;数据模型可以分为概念模型、逻辑模型和物理模型。这些数据模型帮助数据库设计人员设计和管理数据库&#xff0c;以满足用户的需求。 Navicat 强大的数据模型功能主要适用于…