C语言--模拟实现库函数strcpy

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

前言

本章内容我们将通过相关函数来实现库函数中的strcpy。

strcpy实现的基本原理

C语言 strcpy()函数用于对字符串进行复制(拷贝)。需要的头文件为 <string.h>。原理如下

char* strcpy(char* strDestination, const char* strSource);

其中的strSource为源字符串,strDestination为目的字符串,strcpy的作用就是将 strSource 指向的字符串复制到 strDestination。

我们举个例子

int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxx";
	char arr2[] = "hello";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

打印结果如图1
c语言实现strcpy,C语言初阶,c语言,c++,算法,c#,排序算法
我们知道字符串arr2实际上是"hello\0",那么我们在打印字符串的时候有没有打印这个\0呢,我们用监视的方法来看一下,如图2
c语言实现strcpy,C语言初阶,c语言,c++,算法,c#,排序算法
我们发现实际上\0也是被拷贝过来了的。

函数的模拟实现

我们来写一个函数my_strcpy实现字符串的拷贝,框架如下

void my_strcpy(char* dest, char* src)
{

}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

c语言实现strcpy,C语言初阶,c语言,c++,算法,c#,排序算法

当’\0’也被拷贝过去时函数停止运行,我们可以用一个循环来实现代码

void my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}//当src解引用为'\0'时跳出循环,但'\0'还并没有被复制过去
	*dest = *src;//将最后的'\0'也复制过去
}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

代码优化

上述函数只是我们按照基本思路一步步写出来的,肯定不是最优解,看下面这段代码

void my_strcpy(char* dest, char* src)
{
	while (*dest++=*src++)
	{
		;
	}
}

这段代码才是大师级别的书写格式,它将我们上述的个步骤融为一体,下面我们来分析这段代码。
首先我们将解引用的src的值赋给dest,然后后置++,各自都跳到下一个位置再进行赋值,当最后一次src解引用为’\0’并赋值给dest时,由于’\0’的ascll码值为0,当0被赋值给dest,判断结果也为0,0为假,就会跳出循环,这样既把\0复制了过去,还借此跳出了循环,可谓是一举两得。

assert–断言

假设arr1或arr2为空指针会发生什么呢?显然,空指针是不能解引用的,程序会报错。可是这种情况也是难以避免的,为了避免程序崩溃,我们在函数开头添加一个assert(断言),通过一个判断来选择继续执行或中止代码。

void my_strcpy(char* dest, char* src)
{
	assert(src != NULL);//若为真则继续执行,若为假则终止代码
	while (*dest++=*src++)
	{
		;
	}
}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1,NULL);
	printf("%s\n", arr1);
	return 0;
}

我们假定arr2为空指针,代码运行结果就会如下
c语言实现strcpy,C语言初阶,c语言,c++,算法,c#,排序算法
这样,我们既可以有效防止程序崩溃,还可以很清晰的在代码中锁定出问题的地方(比如途中出问题的地方就为源.c line27)。

const关键字

如果我们在函数书写中把拷贝对象和被拷贝对象写反了,会发生什么呢?

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

代码运行结果如图5
c语言实现strcpy,C语言初阶,c语言,c++,算法,c#,排序算法
我们会发现程序崩溃了,原因在于arr2字符串长度放不下arr1。但如果我们加入const关键字修饰就能很好的规避这个问题。

const关键字的作用在于修饰变量,这个变量就被称为常变量,它具备了常量的属性,但本质上还是一个变量。
但我们来看一段代码

int main()
{
    const int num = 10;
	int* p = &num;
	*p = 20;

	printf("%d\n",num);
}

运行结果如图6
c语言实现strcpy,C语言初阶,c语言,c++,算法,c#,排序算法
我们发现,被const修饰的变量num还是被修改了,我么要想保持num不变,就需要修饰指针变量

int main()
{
    int num = 10;
	const int* p = &num;
	*p = 20;

	printf("%d\n",num);
}

这样* p=20这段代码将无法实行。这是因为const如果放在* 左边,修饰的是*p,表示的是指针指向的内容,是不能通过指针来改变的,但是指针变量本身( p )是可以修改的,如果放在 *右边,修饰的就是p,和放在左边完全相反,指针变量本身将无法被修改,但指针指向的内容却可以被修改,num还是会被修改为20

strcpy的返回值

strcpy这个库函数的执行原理实际上是会返回目标空间的起始地址

char* my_strcpy(char* dest, const char* src)
{
	assert(src != NULL);
	assert(dest != NULL);
	char* ret = dest;
	while (*dest++=*src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxx";
	char arr2[] = "hello";
	//目标空间的起始地址 源空间的起始地址
	my_strcpy(arr1,arr2);
	printf("%s\n", my_strcpy(arr1,arr2);//链式访问
	return 0;
}

结语

以上就是标准的库函数strcpy的模拟实现流程,如有出入,欢迎指正。文章来源地址https://www.toymoban.com/news/detail-803543.html

到了这里,关于C语言--模拟实现库函数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日
    浏览(73)
  • 第11章:C语言数据结构与算法初阶之排序

    排序是一种非常重要的算法。 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,

    2024年02月12日
    浏览(44)
  • 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日
    浏览(50)
  • 【C语言】strcpy()函数

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

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

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

    2024年02月13日
    浏览(37)
  • 【C语言】strcpy()函数(字符串拷贝函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.strcpy()函数简介 1.函数功能 2.函数参数 1.char * destination 2.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用strcpy()函数完成字符数组间的字符拷贝 2.使用strcpy()函数完成

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

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

    2024年02月08日
    浏览(43)
  • 【C++初阶】仿函数和priority_queue的模拟实现(附源码)

    仿函数,顾名思义就是 模仿函数,它其实是一个类,类里面重载了运算符() ,在调用这个重载的运算符时,让我们感觉是调用函数一样,可以说相当于C语言里的函数指针一样,但是函数指针的可读性不好,不如仿函数。 1.仿函数即使定义相同,也可能有不同的类型; 2.仿

    2024年02月16日
    浏览(32)
  • 冒泡排序模拟实现qsort()函数

    要模拟qsort()函数,我们首先要知道qsort()函数的特点: 使用快速排序的方法。 适用于任何数据类型的排序。 但由于部分学者还没有学习快速排序算法,所以本篇博客采用冒泡排序来模拟功能类似于qsort()的函数bubble_sort。 C库对qsort()函数解释: 我们得到的关于qsort()函数参

    2024年02月16日
    浏览(53)
  • 【数据结构初阶】十、快速排序(比较排序)讲解和实现(三种递归快排版本 + 非递归快排版本 -- C语言实现)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】九、排序的讲解和实现(直接插入 希尔 直接选择 堆 冒泡 -- C语言)

    2024年02月08日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包