模拟实现库函数strcpy以及strlen

目录

strcpy

介绍库函数strcpy

例子

分析模拟实现思路

补充

assert宏

const关键字来修饰源字符串的指针

代码展示

strlen

介绍库函数strcpy

例子

分析模拟实现思路

计数器

递归

指针-指针

代码展示

计数器

递归

指针-指针

strcpy

介绍库函数strcpy

这个库函数核心目的就是复制字符串 

我们可以登陆https://cplusplus.com/reference/cstring/strcpy/看详细的官方讲解。 

例子

 

分析模拟实现思路

strcpy函数用于将源字符串的内容复制到目标字符串中。该函数的原型为char* strcpy(char* dest, const char* src)。其中dest是目标字符串的指针,src是源字符串的指针。函数将会复制src指向的字符串内容到dest指向的字符串中,并返回dest指针。

在模拟中,我们定义了一个叫做my_strcpy的函数,实现了类似strcpy的功能。函数的参数是一个指向目标字符串和源字符串的指针。在函数体内部,我们使用了一个while循环来逐个复制源字符串中的字符到目标字符串中。最后,函数返回了目标字符串的指针。

在main函数中,我们定义了两个字符数组arr1和arr2。通过调用my_strcpy函数,将arr2中的字符串复制到arr1中,并使用printf函数打印出复制后的字符串。

这个例子使用了assert宏来进行参数的合法性校验,并使用了const关键字来修饰源字符串的指针,以表示在函数内部不会改变源字符串的内容。

总结起来,模拟实现库函数strcpy的代码通过逐个复制字符的方式实现了字符串的复制功能,并使用了assert和const来增加代码的可靠性和安全性。

补充

assert宏

assert宏是一种用于进行参数的合法性校验的工具。它在C/C++中使用,可以简化代码中的参数校验过程。通过assert宏,我们可以在代码中插入断言语句,确保某个条件为真。如果条件不满足,assert会触发一个断言错误,并终止程序的执行。这可以帮助我们及早发现和修复代码中的错误。

在进行参数的合法性校验时,我们可以使用assert宏来断言参数的特定条件,例如判断参数是否为null、是否满足特定的范围或条件等。通过assert宏的使用,我们可以在代码中明确表示参数的合法性要求,并在出现问题时及早发现并处理。

需要注意的是,assert宏只在调试时生效,当代码被编译为发布版本时,默认会禁用assert宏的功能,以提高执行效率。因此,在生产环境中,我们应该谨慎使用assert宏,并确保在发布版本中不会出现断言错误。

总之,assert宏是一种用于进行参数的合法性校验的工具,可以帮助我们在代码中插入断言语句,确保参数满足特定的条件。它是一个常用的调试工具,可以帮助我们及早发现和修复代码中的错误。

const关键字来修饰源字符串的指针

const关键字可以用来修饰源字符串的指针,表示该指针指向的字符串是常量,不可以修改。这样可以保证源字符串的内容不被意外修改。

情况一:const 在*的左边:const int p 与 int const * p 一样

const放在* 的左边,const修饰的是指针指向的内容,表示指针指向的内容,不能通过指针来改变了; 但是指针变量本身可以修改​​​​​​​

int num = 0;
int n = 1000;
const int* p = #
 *p = 20;//err
 p = &n;//ok
 

情况二:const 在*的右边:int * const p 

const放在*的右边,const修饰的指针变量本身,表示指针变量本身的内容不能被修改,但是指针指向的内容,可以通过指针来改变。

int* const p = #
*p = 20;//ok
 p = &n;//err

代码展示

#include<assert.h>
#include<stdio.h>
//#include<string.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "*************";
	char arr2[] = "hello";
	printf("%s\n", my_strcpy(arr1, arr2));  //链式访问
	return 0;
}

strlen

介绍库函数strcpy

 这个库函数核心目的就是求字符串长度

strlen函数是用于计算字符串的长度的函数。它是通过Zend Engine定义的,并且在函数的源码中可以找到其具体实现。

这个函数接受一个字符串作为参数,返回这个字符串的长度,即字符串中字符的个数。

在对字符串进行操作时,了解字符串的特点是非常重要的,其中最重要的特点就是字符串以’\0’结尾。 通过使用strlen函数,我们可以轻松地获取字符串的长度,以便于进行其他相关的操作。

我们可以登陆​​​​​​​https://cplusplus.com/reference/cstring/strlen/​​​​​​​看详细的官方讲解。 

例子

​​​​​​​ 

分析模拟实现思路

计数器

使用计数器的方式,通过遍历字符串,每遍历一个字符计数器加1,直到遇到字符串结束符’\0’为止。

递归

递归函数首先判断当前字符是否为字符串结束符’\0’,如果是,则返回0;否则,递归调用自身并返回结果加1。

指针-指针

使用指针-指针的方式。通过指针p指向字符串的首地址,然后不断向后移动指针p,直到指针p指向字符串结束符’\0’,最后返回指针p与字符串首地址的差值,即字符串的长度。

代码展示

计数器

int my_strlen1(const char* str) {
    int count = 0;
    while (*str != '\0') {
        count++;
        str++;
    }
    return count;
}

递归

int my_strlen2(const char* str) {
    if (*str == '\0')
        return 0;
    else
        return 1 + my_strlen2(str + 1);
}

指针-指针

int my_strlen2(const char* str) {
    if (*str == '\0')
        return 0;
    else
        return 1 + my_strlen2(str + 1);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

poi带表头多sheet导出

导出工具类 package com.hieasy.comm.core.excel;import com.hieasy.comm.core.excel.fragment.ExcelFragment; import com.hieasy.comm.core.utils.mine.MineDateUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.po…

SpringCloud入门——微服务调用的方式 RestTemplate的使用 使用nacos的服务名初步(Ribbon负载均衡)

目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用na…

【Java架构-版本控制】-Git进阶

本文摘要 Git作为版本控制工具&#xff0c;使用非常广泛&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Git基础、Git进阶、Gitlab搭那家&#xff09;来深入学习Git 文章目录 本文摘要1. Git分支管理2. Git分支本质2.1 分支流转流程(只新增文件)2.2 分支流转流…

[NLP]LLM--transformer模型的参数量

1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大规模语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&#xff1a;模型参数规模大&#xff0c;训练数据规模大。以GPT3为例&#xff0c;GPT3的参数量…

基于CentOS搭建私有仓库harbor

环境&#xff1a; 操作系统&#xff1a;CentOS Linux 7 (Core) 内核&#xff1a; Linux 3.10.0-1160.el7.x86_64 目录 安装搭建harbor &#xff08;1&#xff09;安装docker编排工具docker compose &#xff08;2&#xff09;下载Harbor 安装包 &#xff08;3&…

【C语言】程序环境预处理 -- 详解

一、程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。执行环境&#xff0c;它用于实际执行代码。 1、翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代…

【AutoLayout案例04-游戏图片-按钮适配 Objective-C语言】

一、好,我们再看一个案例, 刚才,这个案例, 这么一个案例 这个案例,是什么意思呢, 这里给大家做一个3.5英寸、4.0英寸的屏幕适配, 因为我们这里图片,只有一个,就是4英寸的这么一个图片 什么意思呢,要求我们在3.5英寸的屏幕、和4英寸的屏幕的时候,都能正常显示这个图…

期权是什么?期权的优缺点是什么?

期权是一种合约&#xff0c;有看涨期权和看跌期权两种类型&#xff0c;也就是做多和做空两个方向&#xff0c;走势标的物对应大盘指数&#xff0c;这也是期权与其他金融工具的主要区别之一&#xff0c;可以用于套利&#xff0c;对冲股票和激进下跌的风险&#xff0c;下文介绍期…

LeetCode-56-合并区间

题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 可以使用 LinkedList&#xff0c;…

数字化、智能化的酒店固定资产管理系统

酒店固定资产管理系统是一种专门为酒店行业定制的管理软件&#xff0c;可以帮助酒店管理者全面、准确地管理固定资产。该系统具有以下实际功能和特点&#xff1a;  资产库存功能&#xff1a;通过扫描二维码或手动输入条形码&#xff0c;完成酒店固定资产的有效总结&#xff0…

家政服务小程序制作教程:从设计到开发的详细步骤

在当今的数字化时代&#xff0c;小程序已经成为了一种趋势&#xff0c;不仅提供了方便快捷的应用体验&#xff0c;也成为了各种行业进行营销和客户管理的有力工具。特别是对于家政行业&#xff0c;通过小程序的应用&#xff0c;可以更好地进行业务管理&#xff0c;提升服务质量…

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…

启动metastore服务报错

启动Metastore的时候报错&#xff1a; 简略的报错信息&#xff1a; MetaException(message:Error creating transactional connection factory)Caused by: MetaException(message:Error creating transactional connection factory)Caused by: javax.jdo.JDOFatalInternalExce…

Flink流批一体计算(18):PyFlink DataStream API之计算和Sink

目录 1. 在上节数据流上执行转换操作&#xff0c;或者使用 sink 将数据写入外部系统。 2. File Sink File Sink Format Types Row-encoded Formats Bulk-encoded Formats 桶分配 滚动策略 3. 如何输出结果 Print 集合数据到客户端&#xff0c;execute_and_collect…

Unity实现广告滚动播放、循环播放、鼠标切换的效果

效果&#xff1a; 场景结构&#xff1a; 特殊物体&#xff1a;panel下面用排列组件horizent layout group放置多个需要显示的面板&#xff0c;用mask遮罩好。 using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; using Unity…

手机盖板IR油墨透光率检测仪T03

手机盖板作为手机最外层玻璃面板&#xff0c;其加工一般有落料、倒边、抛光、镀膜、丝印等多道加工工序组成&#xff0c;其中任何一个工序出现差错&#xff0c;都有可能导致手机盖板产生缺陷&#xff0c;例如漏油、透光、IR孔不良、视窗划伤、油墨区划伤、內污、边花等&#xf…

淘宝免费爬虫数据 商品详情数据 商品销售额销量API

场景&#xff1a;一个宽敞明亮的办公室&#xff0c;一位公司高管坐在办公桌前。 高管&#xff08;自言自语&#xff09;&#xff1a;淘宝&#xff0c;这个平台上商品真是琳琅满目&#xff0c;应该有不少销售数据吧。我该怎么利用这些数据呢&#xff1f; 突然&#xff0c;房间…

【vue+uniapp】切换本页面(点击导航按钮)就刷新接口

查阅资料&#xff1a;uni-app官网 点击导航中图标&#xff0c;就执行的方法&#xff08;和methods同级&#xff09;&#xff1a; onTabItemTap(e) {this.getTaskTotal(); },

【PostGreSQL】PostGreSQL到Oracle的数据迁移

项目需要&#xff0c;有个数据需要导入&#xff0c;拿到手一开始以为是mysql&#xff0c;结果是个PostGreSQL的数据&#xff0c;于是装数据库&#xff0c;但这个也不懂呀&#xff0c;而且本系统用的Oracle&#xff0c;于是得解决迁移转换的问题。 总结下来两个思路。 1、Postg…

【Debug】解决RecursionError: maximum recursion depth exceeded in comparison报错

&#x1f680;Debug专栏 目录 &#x1f680;Debug专栏 ❓❓问题&#xff1a; &#x1f527;&#x1f527;分析&#xff1a; &#x1f3af;&#x1f3af;解决方案&#xff1a; ❓❓问题&#xff1a; 循环中报错RecursionError: maximum recursion depth exceeded in compari…