模拟strcpy库函数的实现(超详细)

这篇具有很好参考价值的文章主要介绍了模拟strcpy库函数的实现(超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C语言初阶
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!


前言

strcpy函数其实大家并不陌生,但是每次用的时候要么就复制到字符串的地方不对,要么就出现错误,那到底该怎么用这个函数呢?接下来我将详细给大家讲解strcpy这个函数的本质和用法!


一、简介

1.认识strcpy

再认识这个函数之前,我先放一张图片供大家理解一下:
strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言
在MSDN中查一下这个函数,发现是从后面的数组复制一份复制到前面的数组,那当然,大家伙可能会问了,为什么有一个const被圈出来了,这个const很熟悉呀,之前见到过了,大家伙继续往后看,在文中我会跟大家详细解说一下这个const与指针配套起来的用法。

2.应用strcpy

先带大家看一看运用一下strcpy的奇效。

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[20] = "****************";
	char arr2[] = "hello";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);	
	return 0;
}

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言
看,运用了这个函数以后感觉是在是太方便了,能把arr2中的“hello\0”全部复制到arr1[20]里面去,唉,大家可能会问了,屏幕上显示的是hello啊,没有那个’\0’,大家继续往下面看,就立马能够理解了。

3.监视分析

先上几张图片让大家理解理解。

1.将*赋到arr1数组中。

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言

2.将hello+’0’赋到arr2数组中。

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言

3.进行复制的操作。

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言

4.原理图

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言

利用监视器看strcpy函数能够看到它的本质就是将后面数组里面的字符串+‘、0’拷贝到前面的数组中,但是为什么会有\0呢,这个很简单,arr[]={a,b,c,d}与arr[]="abc"是有本质的区别的,后者多一个\0,大家可以去看看我以后写的关于数组的区分的博客哦!


二、模拟实现strcpy

1.初步实现

先上个代码:

代码1:这个代码很好理解,就先取数组的首地址并交换再往后加加,直到最后一个元素进行交换完退出循环。

#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {
	while (*src != '\0'){
		*dest++ = *src++;
	}           
	*dest = *src;   //拷贝\0
}
int main() {
	char arr1[20] = "****************";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

代码2:这个代码可以把\0直接打印出来,不需要最后一步加上交换一次\0。

#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {
	while (*dest++ = *src++) {
		;
	}           
}
int main() {
	char arr1[20] = "****************";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

但这代码实现的看似没什么问题,可是也隐藏着一个很大的问题,数组是我已经定义好了的,但是,如果是在主函数里面输入NULL(空指针)呢?那让我们先来看看。

2.输入空指针

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言
输入空指针后,编译器立马就报错了,所以,这是肯定不行的!那怎么解决呢?接下来上一串代码!

子函数里加了先判断输入的两个指针元素存不存在空指针,有空指针那就不进行后续操作。

#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {
	if (src == NULL || dest == NULL)
	{
		return;
	}
	while (*dest++ = *src++) {
		;
	}           
}
int main() {
	char arr1[20] = "****************";
	char* p = NULL;
	my_strcpy(arr1, p);
	printf("%s\n", arr1);
	return 0;
}

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言
大家想一个问题,如果一个程序员喝了点小酒醉了,只看到了这个程序可以直接运行,很开心的到老板那里邀功,老板说,你这做的啥!为什么导致程序员犯错了呢,很简单,机器没有报错,程序员以为是对的,所以,接下来引进一个新的函数为“断言’(assert)函数。

3.assert

assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真那就正常运行

实现代码:

#include<assert.h>
#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src) {
	/*if (src == NULL || dest == NULL)
	{
		return;
	}*/
	assert(src != NULL);
	assert(dest != NULL);

	while (*dest++ = *src++) {
		;
	}           
}
int main() {
	char arr1[20] = "****************";
	char* p = NULL;
	my_strcpy(arr1, p);
	printf("%s\n", arr1);
	return 0;
}

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言

很明显,这个程序报错了,而且给你标注了哪里出错了,是不是很方便快捷,当然,头文件不要漏掉。

4.这阶段完整代码

这一阶段的完整代码如下:

#include<assert.h>
#include<stdio.h>
//#include<string.h>
void my_strcpy(char* dest, char* src)
{
	assert(dest && src);//断言指针的有效性
	while (*dest++ = *src++)
	{
		;
	}
}

int main()
{
	//strcpy - 字符串拷贝
	//char arr1[20] = "xxxxxxxxxxx";
	//char arr2[] =   "hello";
	//my_strcpy(arr1, arr2);
	//printf("%s\n", arr1);
	char arr3[20] = {0};
	char* p = NULL;
	my_strcpy(arr3, p);

	return 0;
}

三、返回值

大家如果细心看那张strcpy的图,会发现两个小问题,这strcpy是有返回值的呀,还有那个const怎么一直没有解决呢?接下来,我们开始解决问题!

1.返回类型

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言
那接下来修改一下这个代码吧!

#include<assert.h>
#include<stdio.h>
//#include<string.h>
char* my_strcpy(char* dest, 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;
}

这样就有返回值了!

2.const

接下来到了最激动人心的时刻,久久困扰的const该怎么做呢?下面且听我分析。

大家先来看看这张图片,生动形象的解释了const。

strcpy实现,C语言初阶,数据结构,算法,c++,开发语言,c语言

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

//const放在* 的左边,const修饰的是指针指向的内容,表示指针指向的内容,不能通过指针来改变了; 但是指针变量本身可以修改
int num = 0;
int n = 1000;
const int* p = &num;
 *p = 20;//err
 p = &n;//ok

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

 const放在*的右边,const修饰的指针变量本身,表示指针变量本身的内容不能被修改,但是指针指向的内容,可以通过指针来改变。
int* const p = &num;
*p = 20;//ok
 p = &n;//err

到这里就完美解决了strcpy函数的问题。


四、完整代码

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

总结

模拟strcpy函数让我们大家深刻理解了这个函数的原理以及用法,最好的一点是让我们了解了assert和const的使用,一举三得!!!!

客官都阅读到这边了,码字不易,求个三连支持!文章来源地址https://www.toymoban.com/news/detail-766047.html

到了这里,关于模拟strcpy库函数的实现(超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言--strcmp函数,strcat函数,strcpy函数详解及实现

    目录 1.strcmp函数 1.1函数介绍 1.2函数使用 1.2.1代码 1.2.2运行结果 1.3模拟实现strcmp 1.3.1实现思路 1.3.2代码  1.3.3运行结果 2.strcat函数 2.1函数介绍 2.2函数使用  2.2.1代码 2.2.2运行结果 2.3模拟实现strcat 2.3.1实现思路 2.3.2代码  2.3.3运行结果 3.strcpy函数 3.1函数介绍 3.2函数使用 3.2.1代

    2024年02月01日
    浏览(65)
  • 【C语言】内存函数的详细教学和模拟实现

    🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠ 📝个人主页:gugugu—精品博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:gugugu的精品博客 ✉️

    2024年02月07日
    浏览(26)
  • 【C语言】字符函数和字符串函数的详细教学和模拟实现

    🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠ 📝个人主页:gugugu—精品博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:gugugu的精品博客 ✉️

    2024年02月08日
    浏览(28)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(33)
  • 初阶C语言——特别详细地介绍函数

     💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        从标题也能看出来,我们有要进行 超详细

    2024年02月14日
    浏览(24)
  • 【数据结构初阶】——第八节.优先级队列(小根堆的模拟实现)

     作者简介:大家好,我是未央; 博客首页: 未央.303 系列专栏:Java初阶数据结构 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 目录 文章目录 前言 引言 一、堆的概念 二、堆的性质  三、堆的操作 3.1 向下调整算法 3.2 小根堆的创建 3.3 向上调整

    2024年02月07日
    浏览(37)
  • 【C语言】strcpy()函数

    文章目录 一、strcpy()函数的简介 二、strcpy()函数的具体使用 三、使用strcpy()函数的注意事项  strcpy()函数:是将一个字符串复制到另一块空间地址中 的函数,‘\\0’是停止拷贝的终止条件,同时也会将 \\\'\\0\\\' 也复制到目标空间。下面是库中的strcpy()函数声明: char* strcpy(char* des

    2024年02月03日
    浏览(28)
  • C语言-函数STRCPY

    char *strcpy(char *restrict dst, const char *restrict src); 把src的字符串拷贝到dst restrict表明src和dst不重叠(C99) 返回dst 为了能链起代码来 char dst = (char )malloc(strlen(src) + 1); strcpy(dst, src);

    2024年02月04日
    浏览(39)
  • 【初阶C语言3】特别详细地介绍函数以及在初阶中重要的算法——递归

     💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        从标题也能看出来,我们有要进行 超详细

    2024年02月08日
    浏览(32)
  • C语言的strcpy()函数

    strcpy()函数的简介 strcpy()函数用于将一个字符串拷贝到另一个内存地址的函数,拷贝停止的条件是遇到\\\'\\0\\\',同时会将\\\'\\0\\\'一同拷贝到目标地址。下面是strcpy()函数的声明: 1. 函数的参数: char* destination---------目标字符串的首地址 const char* source------源地址:被复制的字符串的首

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包