C语言 模拟实现strcpy与strcat函数详解

 更新时间:2022年04月08日 17:22:25   作者:不一样的烟火a  
这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接

这里有超详细的函数模实现分享,带大家一起来模拟实现这些函数,后续还将更新更多的函数模拟实现的文章。

一、strcpy函数的介绍

1.函数的声明

char* strcpy(char * destination, const char * source );

2.函数功能与注意事项

  • 将源指向的字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)。
  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。

3.函数的使用

#include<stdio.h>
#include<string.h>//使用strcpy函数时记得引用它的头文件
 
int main()
{
	char ch1[7] = "abcdef";
	char ch2[10];//ch2为目标数组,空间必须比ch1大
	strcpy(ch2, ch1);
	printf("%s\n", ch2);
	return 0;
}

运行结果

二、模拟实现strcpy函数

1.模拟分析

1.我们需要将源指向的字符串复制到目标指向的数组中,包括终止空字符,所以我们就可以一个字符一个字符的复制过去,注意终止空字符'\0'也要复制过去,如果没有将‘\0’复制过去的话,后面如果想要打印将这个赋值过去的字符串的话就会出现问题。

2.因为我们源指向的字符串是不需要改变的,所以我们需要将我们源指向的字符串用const限制,以防它被改变,让其变得更安全。

3.为了避免传进来的地址是空指针,我们需要用assert来断言传进来的地址不是空指针。

4.为了实现链式访问,我们要将传进来的目标起始地址(destination)返回。由于这个函数在执行的时候会改变destination存储的内容,所以我们要重新创建一个char*类型的指针来存储这个地址。

2.模拟实现

下面代码有点干,需要细品,建议收藏以免忘记。

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char ch1[7] = "abcdef";
	char ch2[10];//ch2为目标数组,空间必须比ch1大
	my_strcpy(ch2, ch1);//将ch1中的字符串复制到ch2中
	printf("%s\n", my_strcpy(ch2, ch1));//链式访问
	return 0;
}

运行结果

三、strcat函数的介绍

1.函数的声明

char * strcat ( char * destination, const char * source );

2.函数功能与注意事项

  • 将源字符串追加到目标字符串。目标字符串的终止空字符'\0'被源字符串的第一个字符覆盖,并包含一个终止空字符'\0'在新字符串的末尾,由两者在目的地连接而成。
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。 

3.函数的使用

#include<stdio.h>
#include<string.h>//使用strcat函数时记得引用它的头文件
 
int main()
{
	char ch1[4] = "def";
	char ch2[7] = "abc"; //ch2为目标数组,空间必须比ch1大
	strcat(ch2, ch1); //将ch1中的字符串追加到ch2中
	printf("%s", ch2);
	return 0;
}

运行结果

四、模拟实现strcat函数

1.模拟分析

1.我们追加字符串时是将源字符串追加到目标字符串里面,我们需要将从目标字符串里面'\0'的位置开始追加,所以我们首先就需要找到目标字符串中'\0'的位置。并且我们追加完后需要在字符串的追后多追加一个'\0',使这个新字符串完整。

2.因为我们源指向的字符串是不需要改变的,所以我们需要将我们源指向的字符串用const限制,以防它被改变,让其变得更安全。

3.为了避免传进来的地址是空指针,我们需要用assert来断言传进来的地址不是空指针。

4.为了实现链式访问,我们要将传进来的目标起始地址(destination)返回。由于这个函数在执行的时候会改变destination存储的内容,所以我们要重新创建一个char*类型的指针来存储这个地址。

2.模拟实现

#include<stdio.h>
#include<assert.h>
 
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//断言传进来的地址不是空指针
	char* ret = dest;//保存目标起始地址
	while (*dest)//找到'\0'的地址
	{
		dest++;
	}
	while (*dest++ = *src++)//追加字符串
	{
		;
	}
	return ret;
}
int main()
{
	char ch1[4] = "def";
	char ch2[7] = "abc"; //ch2为目标数组,空间必须比ch1大
	printf("%s\n", my_strcat(ch2, ch1));//链式访问
	return 0;
}

运行结果

总结

这就是今天的全部内容了,要是大家觉得有用的话记得给博主一个三连哦,嘻嘻。最后祝考研的同学都能上岸,找工作的同学都能进大厂。

到此这篇关于C语言 模拟实现strcpy与strcat函数详解的文章就介绍到这了,更多相关C语言 strcpy函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C++ 中的三种继承方式

    详解C++ 中的三种继承方式

    这篇文章主要介绍了详解C++ 中的三种继承方式,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    C语言详细讲解strcpy strcat strcmp函数的模拟实现

    这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat和strcmp函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接,strcmp()函数作用是比较字符串str1和str2是否相同
    2022-05-05
  • C++ virtual destructor虚拟析构函数

    C++ virtual destructor虚拟析构函数

    C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放,今天通过本文给大家介绍C++ virtual destructor虚拟析构函数的相关知识,感兴趣的朋友一起看看吧
    2021-05-05
  • C++实现将内容写入文件的方法总结

    C++实现将内容写入文件的方法总结

    本文主要总结了一下C/C++将内容写入文件的方法,C的方法有些单调,毕竟没有库函数。C++则丰富些,下面我把搜集到的整理一下,供大家参考
    2023-04-04
  • GCC编译过程(预处理,编译,汇编,链接)及GCC命令详解

    GCC编译过程(预处理,编译,汇编,链接)及GCC命令详解

    文章详细介绍了GCC编译器的工作原理,包括预处理、编译、汇编和链接四个主要阶段,每个阶段都有其特定的任务和输出文件,文章还解释了如何使用GCC命令选项来查看每个阶段的输出,以及如何通过调整编译选项来优化程序性能或调试问题,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • C语言怎样用指针指向字符串

    C语言怎样用指针指向字符串

    这篇文章主要介绍了C语言怎样用指针指向字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 浅谈c++中的输入输出方法

    浅谈c++中的输入输出方法

    下面小编就为大家带来一篇浅谈c++中的输入输出方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C语言中printf()缓冲问题详解

    C语言中printf()缓冲问题详解

    这篇文章主要给大家介绍了关于C语言中printf()缓冲问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • C++私有继承(二)

    C++私有继承(二)

    这篇文章主要介绍了C++私有继承,在私有继承时,基类的公有对象以及保护对象会变成派生类的私有对象。我们可以在派生类方法当中使用它,但无法通过派生类对象直接调用,但无法访问基类的私有方法和对象,下面具体内容,需要的朋友可以参考一下
    2022-01-01
  • QT编写地图实现在线轮廓图的示例代码

    QT编写地图实现在线轮廓图的示例代码

    轮廓图也叫行政区划,这里的轮廓图是指百度地图的区域轮廓图。本文将为大家介绍QT如何实现在线轮廓图的编写,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12

最新评论