模拟实现库函数strcpy以及strlen

news2024/11/26 0:51:28

目录

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);
}

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

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

相关文章

docker 04.更加重要的命令

之前的都是基础命令&#xff0c; 前台交互进程和后台守护进程&#xff1a; 重新进入容器&#xff1a; docker中的导入导出&#xff1a; docker中的拷贝到&#xff1a;

SpringBoot整合OpenAI实现AI聊天 (精简demo)

1. OpenAI官网/*** 官网获取密钥基本条件* * 1. 翻墙, 能访问外网* 2. 拥有国外手机号码* 3. 注册账号* 4. 获取密钥*/https://openai.com/ 2. 获取OpenAI密钥 (怎么简单怎么来) // 直接在淘宝上购买, 买多几个随机访问 sk-xxxx 3. 依赖 <dependency><groupId>c…

智能客服系统:解决企业服务、管理难题的新选择

在数字化时代&#xff0c;智能客服系统是企业服务、管理的新选择。智能客服系统可以通过自然语言处理、人工智能等技术实现与顾客的智能对话&#xff0c;提升企业客服效率和服务质量。同时&#xff0c;智能客服系统也可以为企业提供实时数据分析和监管&#xff0c;进一步优化管…

图解算法--查找算法

目录 查找算法 一、顺序查找 二、二分法查找 三、插值查找法 四、斐波那契查找法 查找算法 查找算法根据数据量的大小&#xff0c;可以将其分为以下两种 内部查找&#xff1a;内部查找是指在内存或内部存储器中进行查找操作的算法。内部查找适用于数据量较小、存储在内存…

实时记录开房信息,在线开房记录查询工具

随着社会的高速发展&#xff0c;异地出差人士越来越多&#xff0c;往往全国跑&#xff0c;每每去到一个地区都要开房休息&#xff0c;当开房数量越来越多的时候&#xff0c;往往会把数据混乱&#xff0c;不利于回公司后的出差费用报销&#xff0c;故此发现了一款实时记录实时查…

h3c多系列路由器存在任意用户登录漏洞

该文章来自作者日常学习笔记&#xff0c;也有部分文章是经过作者授权和其他公众号白名单转载&#xff0c;未经授权&#xff0c;严禁转载&#xff0c;如需转载&#xff0c;联系开白。请勿利用文章内的相关技术从事非法测试&#xff0c;如因此产生的一切不良后果与文章作者无关。…

好用的c++11纳米级的测量时间消耗的类

需要包含的头文件及类实现&#xff1a; #include <chrono> #include <thread>class Timer { public:Timer() : m_StartTimepoint(std::chrono::high_resolution_clock::now()) {}~Timer() {Stop();}void Stop() {auto endTimepoint std::chrono::high_resolution…

利用改进的遗传算法(种群隔离与个体迁移)mpi并行解决tsp问题

序 关于tsp问题的概述以及如何使用遗传算法进行求解已经在上一篇文章中说明了&#xff1a;遗传算法解决TSP问题. 但是&#xff0c;作为一种演化算法&#xff0c;遗传算法还存在着许多问题&#xff0c;比如早熟的情况&#xff0c;很容易在算法前期就已经收敛了&#xff0c;大量…

得帆信息CEO张桐接受21世纪财经深度专访,表示AIGC+低代码将带来生产效率的变革

近日&#xff0c;得帆信息创始人兼CEO张桐接受了21世纪财经深度专访&#xff0c;他表示AIGC低代码的黄金组合&#xff0c;将带来生产效率的变革。 眼下&#xff0c;低代码与AI创新的联接才刚刚开始&#xff0c;也必然会带来生产效率的变革。 在AIGC汹涌的浪潮下&#xff0c;聊…

【LNMT与动静分离】

目录 一、LNMT 1.部署tomcat 1.1 单机部署 1.2 多机部署 2.部署nginx 3.部署Mariadb 4.配置Nginx 二、Nginx高级配置 1.location 2.1 应用场景 2.2 书写位置 2.3 重写条目写法 2.4 返回状态码 2.5 案例 三、动静分离 1.修改nginx配置文件 2.测试 一、LNMT 1.…

四层负载均衡的NAT模型与DR模型推导 | 京东物流技术团队

导读 本文首先讲述四层负载均衡技术的特点&#xff0c;然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理。通过本文可以了解到四层负载均衡的技术特点、NAT模型和DR模型的工作原理、以及NAT模型和DR模型的优缺点。读者可以重点关注NAT模型到DR模型演进的原…

linux字符串处理

目录 1 C 截取字符串,截取两个子串中间的字符串2 获取该字符串后面的字符串用 strstr() 函数查找需要提取的特定字符串&#xff0c;然后通过指针运算获取该字符串后面的字符串用 strtok() 函数分割字符串&#xff0c;找到需要提取的特定字符串后&#xff0c;调用 strtok() 传入…

c语言六子棋(Alpha-Beta剪枝算法)

c语言Alpha-Beta剪枝算法六子棋介绍 Alpha-Beta剪枝算法是一种用于优化博弈树搜索的算法&#xff0c;可以在搜索过程中减少不必要的计算&#xff0c;从而提高搜索效率。该算法常用于博弈游戏&#xff0c;如六子棋。 六子棋是一种类似于五子棋的棋类游戏&#xff0c;在一个六边形…

C#: Json序列化和反序列化,集合为什么多出来一些元素?

如下面的例子&#xff0c;很容易看出问题&#xff1a; 如果类本身的无参构造函数&#xff0c; 就添加了一些元素&#xff0c;那么在序列化&#xff0c;再反序列化&#xff0c;会导致元素增加。 如果要避免&#xff0c;必须添加&#xff1a; new JsonSerializerSettings() { …

目标检测(凑字数,凑字数,为什么标题一定要五个字)

写在最前&#xff1a; 昨天七夕&#xff0c;一个人躲在家里打游戏&#xff0c;不敢出门&#xff0c;怕被喂狗粮。 一个即将步入中年的老男人&#xff0c;弱小&#xff0c;无助&#xff0c;单身&#xff0c;肥胖&#xff0c;贫穷。但是怀揣着一丢丢情怀和梦想&#xff0c;妄图吃…

运算符(个人学习笔记黑马学习)

算数运算符 加减乘除 #include <iostream> using namespace std;int main() {int a1 10;int a2 20;cout << a1 a2 << endl;cout << a1 - a2 << endl;cout << a1 * a2 << endl;cout << a1 / a2 << endl;/*double a3 …

github加速方式

windows系统访问github加速方式 第一步&#xff1a;查询dns地址第二步&#xff1a;host文件添加dns映射第三步&#xff1a;刷新dns 第一步&#xff1a;查询dns地址 查询工具&#xff1a;https://coding.tools/cn/nslookup 依次将以下网址的ip查询出来&#xff1a; github.com …

javaee之黑马乐优商城1

问题1&#xff1a;整体的项目架构与技术选型 技术选型 开发环境 域名测试 如何把项目起来&#xff0c;以及每一个目录结构大概是什么样子 通过webpack去启动了有个项目&#xff0c;这里还是热部署&#xff0c;文件改动&#xff0c;内容就会改动 Dev这个命令会生成一个本地循环…

睿趣科技:抖音开网店卖玩具怎么样

近年来&#xff0c;随着社交媒体平台的飞速发展&#xff0c;抖音作为一款短视频分享应用也迅速崭露头角。而在这个充满创业机遇的时代背景下&#xff0c;许多人开始探索在抖音平台上开设网店&#xff0c;尤其是卖玩具类商品&#xff0c;那么抖音开网店卖玩具究竟怎么样呢? 首先…