C语言-----函数功能实现---strcpystrlen

news2025/3/15 15:18:57

1.函数功能参数介绍

该函数的功能就是把一个字符串复制到另外的一个数组,包括'\0';

2.首先我们要明确字符串的复制也是包括最后的\0的;

void mystrcpy(char* dest, char* src)
{
	
	while (*src!='\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = "xxxxxxxxxxxxxx";
	mystrcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

跳出while循环之后就会把末尾的\0实现复制;

3.继续优化----------------------------------------------

我们阅读上面的资料就会发现strcpy的返回值就是dest,所以我们利用这个就可以继续优化代码,

让自定义函数返回dest,因为循环的过程中dest发生了变化所以我们定义一个新的指针变量记录dest

的初始位置,并且作为返回值;

char* mystrcpy(char* dest, char* src)
{
	char* ret = dest;
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = "xxxxxxxxxxxxxx";
	
	printf("%s\n", mystrcpy(arr2, arr1));
	return 0;
}

4.代码继续优化

像这样,如果有空指针,我们可以使用assert断言,这样就可以准确的找出程序的出错位置,如果没有断言,我们就无法知道自己错在哪里,但是断言会准确的告诉我们出错的位置,提高代码的可读性,但是记住需要包含assert.h的头文件;

#include<assert.h>
char* mystrcpy(char* dest, char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = "xxxxxxxxxxxxxx";
	char* p = NULL;
	mystrcpy(p, arr1);
	printf("%s\n", arr2);
	return 0;
}

5.继续优化

#include<assert.h>
char* mystrcpy(char* dest, char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest++ = *src++)//到\0的时候就会结束,因为\0的ascii是0
	{
		;//空语句
	}
	return ret;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = "xxxxxxxxxxxxxx";
	char* p = mystrcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

这里面让while循环语句里面的内容变得更加精炼,把其实现的部分放到了判断条件里面;

解引用操作符不会作用于加加,这样指针继续向后移动,当到\0的时候,控制循环条件的赋值语句的结果是\0的ASCII值,也就是0,这样就结束了循环;

6.到这里,函数的功能就已经实现了,但是会发现少了参数里的const,补上就好了,其实const的作用就是让我们无法改变修饰的值;

char* mystrcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = "xxxxxxxxxxxxxx";
	char* p = NULL;
	mystrcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

7.const修饰指针变量

(1)当const放在*左边的时候,指针指向的内容不能改变,指针本身可以改变;

(2)当const放在*右边的时候,指针本身不可以改变,但是指向的内容可以改变;

(3)当*的左右都有const,无论是指针本身还是指向的内容,都无法改变;

8.明白const的作用,再回到函数的功能实现,就会发现const的必要性,如果在过程里面,我们把*src和*dest的位置颠倒了,程序就会报错,因为这样改变了*src,加上const可以让我们的程序变得更加严谨。

9.利用const,assert我们实现strlen的功能

#include<assert.h>
size_t mystrlen(const char* p)
{
	assert(p != NULL);
	char* left = p;
	size_t count = 0;
	while (*p)
	{
		p++;
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "wj djekd kedkkk";
	size_t len = mystrlen(arr);
	printf("%zd\n", len);
	//%u打印无符号数的,和%zd差别不大;
	return 0;
}

资料显示,strlen的返回类型是size_t,这个是位sizeof设计的一个类型,是unsigned int 或者是

unsigned long类型,所以我们把len,count都设计为size_t类型。

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

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

相关文章

VMwareWorkstation17.0虚拟机安装搭建Windows 11虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建Windows 11虚拟机&#xff08;完整图文详细步骤教程&#xff09; 一、下载Windows11二、配置Windows11虚拟机机器环境三、启动Windows11系统 一、下载Windows11 【点击打开最全面的Windows 11原版系统镜像下载地址】 https://blog.csdn.ne…

STM32——OLED菜单

文章目录 一.补充二. 二级菜单代码 简介&#xff1a;首先在我的51 I2C里面有OLED详细讲解&#xff0c;本期代码从51OLED基础上移植过来的&#xff0c;可以先看完那篇文章&#xff0c;在看这个&#xff0c;然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

目录 一、GPIO 概述二、GPIO模块相关API三、实例四、GPIO HDF驱动开发4.1、LED驱动程序(待续...)4.2、LED驱动配置(待续...) 坚持就有收获 轻量系统设备通常需要进行外设控制&#xff0c;例如温湿度数据的采集、灯开关的控制&#xff0c;因此在完成内核开发后&#xff0c;需要进…

【无标题】Matlab 之axes函数——创建笛卡尔坐标区

**基本用法&#xff1a;**axes 在当前图窗中创建默认的笛卡尔坐标区&#xff0c;并将其设置为当前坐标区。 应用场景1&#xff1a;在图窗中放置两个 Axes 对象&#xff0c;并为每个对象添加一个绘图。 要求1&#xff1a;指定第一个 Axes 对象的位置&#xff0c;使其左下角位于…

精工电联:定制精工线缆,赋能科技互联---致力于为客户提供卓越的连接线缆和连接器产品

精工电联 “定制精工线缆 &#xff0c;赋能科技互联”&#xff0c;精工电联致力于为高科技产业提供全方位、多维度的集成线缆解决方案。凭借深厚的研发实力和丰富的行业经验&#xff0c;精工电联已经成功地在工控设备、医疗设备、人工智能、新能源领域、轨道交通和超声波设备等…

TCP三次握手、四次挥手(简易版)

TCP是面向连接的&#xff1a;在真正通讯之前&#xff0c;必须先建立一条通讯线路&#xff0c;必须先完成连接。 TCP完成连接的过程&#xff1a;&#xff08;保证通讯线路畅通&#xff09; 建立连接&#xff1a; 三次握手基本过程 ①客户端首先向服务器发送一个建立连接的…

中科星图——LANDSAT_8/02/T1/TOA的Landsat8_C2_TOA类数据集

简介 数据名称&#xff1a; Landsat8_C2_TOA 数据来源&#xff1a; USGS 时空范围&#xff1a; 2020年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat8_C2_TOA数据集是将数据每个波段的辐射亮度值转换为大气层顶表观反射率TOA&#xff0c;是…

小苯的数组切分 ---- 牛客月赛

题目描述 qionghuaqionghuaqionghua 给了小苯一个长度为 n 的数组 a&#xff0c;希望小苯将数组 aaa 分为恰好非空的三段。即&#xff1a;[1,l−1],[l,r],[r1,n]这三段&#xff0c;其中 1< l≤r<n。接着&#xff1a; ∙ 第一段的所有数字做 ⊕&#xff08;按位异或&…

Acwing二分和前缀和(二)

机器人跳跃问题 原题链接&#xff1a;https://www.acwing.com/activity/content/problem/content/1570/ 二分查找更新条件只有两种&#xff1a; Rmid;else Lmid1&#xff1a;mid(LR)/2Lmid;else R mid-1&#xff1a;mid(LR1)/2 这两种更新条件的结果是一样的。 #include<…

STL:优先级队列的实现

STL中优先级队列本质上就是堆。在上一篇博客中讲到过&#xff1a;堆是一种完全二叉树&#xff0c;逻辑结构上看起来像树&#xff0c;但在物理结构中是存储在线性表中。与普通线性表不同的是&#xff0c;堆中数据大小是规律排列的&#xff1a;小堆中每个节点都大于它的父节点&am…

FPGA中的模块调用与例化

目录 一、模块调用与实例化 1.1 模块调用 1.2 模块实例化 1.3 Verilog例化语句及其用法 1.3.1 例化语句的基本格式 1.3.2 实例化三种不同的连接方法 二、模块调用实例-全加器与半加器 2.1 半加器模块 2.2 全加器模块 三、参数定义关键词与整数型寄存器 3.1 参数定义关…

《区块链公链数据分析简易速速上手小册》第10章:未来趋势和挑战(2024 最新版)

文章目录 10.1 区块链技术的发展方向10.1.1 基础知识10.1.2 重点案例&#xff1a;构建一个简单的智能合约步骤1: 创建智能合约步骤2: 部署智能合约步骤3: 使用Python与智能合约交互结语 10.1.3 拓展案例 1&#xff1a;探索 DeFi 应用准备工作实现步骤步骤1: 获取Compound市场数…

代码随想录算法训练营第二十天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

tips&#xff1a; 二叉搜索树一定是中序遍历&#xff0c;因为只有中序遍历二叉搜索树它的元素才是有序的。 回溯法则使用后序遍历方式&#xff0c;左右中&#xff0c;主要处理逻辑在中。采用后序是因为中的处理逻辑需要左分支和右分支递归带回来的处理结果&#xff0c;从而通过…

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表&#xff0c;其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义&#xff0c;通过 SQL 语句使用视图时…

OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常

问题环境 系统版本&#xff1a;OpenHarmony-3.2-Release 问题现象 配置设备默认方向&#xff0c;例如修改为横屏显示&#xff0c;修改文件display_manager_config.xml的buildInDefaultOrientation参数值为2(Orientation::HORIZONTAL)。 源码中文件位于foundation/window/win…

[AIGC ~ coze] Kafka 消费者——从源码角度深入理解

Kafka 消费者——从源码角度深入理解 一、引言 Kafka 是一个分布式的流处理平台&#xff0c;广泛应用于大规模数据处理和实时数据管道。在 Kafka 生态系统中&#xff0c;消费者扮演着至关重要的角色&#xff0c;它们从 Kafka 主题中读取数据并进行处理。本文将深入探讨 Kafka …

Linux工具篇Vim

分享Linux的一些基础的工具&#xff0c;今天分享的就是Linux下的vim&#xff0c;vim其实是一个编辑器。我们可以理解为Windows下的一个记事本。 这个是vim的键盘图。 Linux编辑器-vim使用 vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是…

【机器学习笔记】11 支持向量机

支 持 向 量 机 &#xff08; Support Vector Machine,SVM &#xff09; 支 持 向 量 机 是 一 类 按 监 督 学 习 &#xff08; supervisedlearning&#xff09;方式对数据进行二元分类的广义线性分类器&#xff08;generalized linear classifier&#xff09;&#xff0c;其…

Codeforces Round 919 (Div. 2)题解(A-E)

https://codeforces.com/contest/1920 A Satisfying Constraints 链接&#xff1a;A - Satisfying Constraints 代码 #include <bits/stdc.h> using namespace std; int main() {int T;cin >> T;while(T--){int n;scanf("%d", &n);vector<int&…

RK3399平台开发系列讲解(USB篇)USB 枚举和断开过程

🚀返回专栏总目录 文章目录 一、连接与检测二、USB设备枚举三、断开过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍 USB 枚举/断开过程。 一、连接与检测 二、USB设备枚举 USB设备枚举一