【C语言】strcpy()函数

news2025/4/20 20:34:41

🦄个人主页:修修修也

🎏所属专栏:C语言

⚙️操作环境:Visual Studio 2022


目录

 一.strcpy()函数简介

1.函数功能

2.函数参数

1>.char * destination

2>.const char * source

3.函数返回值

4.函数头文件

二.strcpy()函数的具体使用

1.使用strcpy()函数完成字符数组间的字符拷贝

2.使用strcpy()函数完成字符数组与常量字符串间的拷贝

三.模拟实现strcpy()函数功能

🎏实现思路

1.函数参数及返回值设定逻辑

📌函数参数

📌函数返回值

2.函数功能实现

🎏代码编写

🎏运行测试

结语


一.strcpy()函数简介

我们先来看一下cplusplus.com - The C++ Resources Network网站上strcpy()函数的基本信息:

1.函数功能

可以看到,strcpy()函数的功能是:

将源头指向的C字符串复制到目标指向的数组中,包括结尾的'/0'字符,并在'\0'字符处停止拷贝.

2.函数参数

该函数一共有两个参数,分别是:

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

1>.char * destination

第一个参数的类型是char*(字符型指针),它表示拷贝的目的地,它的作用是为函数提供目的地的地址,以便函数能够准确地将内容拷贝到目的地的地址空间.

2>.const char * source

第二个参数的类型是被const修饰(const修饰的指针,const在*左表示指针指向的内容不可修改,const在*右表示指针的指向不可修改)的char*(字符型指针),它表示拷贝信息的来源,它的作用是为函数提供拷贝源头的地址,以便函数能够准确找到拷贝的源头进行拷贝.

3.函数返回值

函数的返回值类型是char*(字符型指针),它的作用是在函数运行结束后返回拷贝后的目的地地址.

4.函数头文件

该函数包含在头文件<string.h>中.


二.strcpy()函数的具体使用

strcpy()函数的使用场景是:

当我们想将一个字符串的内容拷贝到另一个字符串中时,我们可以使用strcpy()函数来实现这一诉求.

1.使用strcpy()函数完成字符数组间的字符拷贝

如下,我们使用strcpy()函数将字符数组str1中的内容拷贝到str2数组中:

分别给strcpy()函数传入两个参数:

拷贝目的地址(即str2),拷贝来源地址(即str1).

#define _CRT_SECURE_NO_WARNINGS 1

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "Sample string";
	char str2[40]={0};
	printf("str1: %s\nstr2: %s\n", str1, str2);

	strcpy(str2, str1);
	printf("str1: %s\nstr2: %s\n", str1, str2);

	return 0;
}

在vs2022编译器中运行查看结果:

可见strcpy()函数成功将str1中的内容拷贝到了str2中.


2.使用strcpy()函数完成字符数组与常量字符串间的拷贝

除了上述将字符串数组中的字符串拷贝到字符串数组中的操作,我们还可以让strcpy()函数常量字符串中的字符串拷贝到字符数组中,如:

分别给strcpy()函数传入:

拷贝目的地址(即str1),拷贝来源地址(一个常量字符串).

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main()
{
	char str3[40] = {0};
	printf("str3: %s\n", str3);

	strcpy(str3, "copy successful");
	printf("str3: %s\n",str3);

	return 0;
}

在vs2022编译器中运行查看结果:

可见strcpy()函数成功的将常量字符串中的内容拷贝到了str3中.

除了上面那种直接将常量字符串放在参数位置形式的传参方式,我们还可以通过传递创建的常量字符串指针的形式传参,如:

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main()
{
	char str3[40] = {0};
	char* str4 = "copy successful";//创建一个常量字符串指针str4
	printf("str3: %s\n", str3);

	strcpy(str3,str4);
	printf("str3: %s\n",str3);

	return 0;
}

在vs2022编译器中运行查看结果

可见strcpy()函数成功的将常量字符串str4中的内容拷贝到了str3中.


三.模拟实现strcpy()函数功能

🎏实现思路

1.函数参数及返回值设定逻辑

📌函数参数
char * destination

因为strcpy()函数要实现的是字符串的拷贝,所以在使用strcpy()函数时我们只需要确保其可以处理字符型指针即可,因此在这里我们需要将目的地的地址类型设置为字符型指针,以便函数后续可以处理字符类型的数据.

const char * source

将来源地址的类型设置为字符型指针的原因与目的地的原因相同,都是便于函数可以处理字符型的数据.

而给来源的地址指针加上const的原因是防止拷贝的过程中将来源的内容不慎修改,在*指针左侧加上const就可以使const修饰的指针指向的内容变成常量.


📌函数返回值
char*

函数返回值设置为char*的原因同目的地及来源地相同,都是便于函数可以在处理完字符类型的数据后可以返回目的地的地址.


2.函数功能实现

采用循环的方式将字符串内容逐一拷贝,直到拷贝完源头字符串的结束标志'\0'为止.

注意事项:

  • 因为最后需要返回目的地的起始地址,因此拷贝前应当提点记录下目的地起始位置的指针.
  • 因为无论源地址为NULL,还是目的地地址为NULL,在后续函数的运行过程中都会导致指针的越界访问,因此我们选择在函数一开始就加入assert断言,防止传入空指针情况的出现.
  • 我们循环终止的条件是(源字符串不等于'\0'),这意味着当函数拷贝到'\0'字符时就会停止拷贝,结束运行,这会导致'\0'并没有被拷贝到目的地中,后续可能会导致出现一些Bug.因此我们应该在循环结束后再将'\0'也拷贝到目的地中,防止程序出现问题.

有对assert断言宏还不了解的朋友可以移步这篇博客:

不想改bug?程序员必须学会使用的报错函数assert!(断言函数详解)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133822893?spm=1001.2014.3001.5502


🎏代码编写

char* my_strcpy(char* destination,const char* source)
{
	assert(source);
	assert(destination);

	char* ret = destination;    //用来记录目的地地址,以便后续返回
	while (*source != '\0')
	{
		*destination = *source;
		destination++;
		source++;
	}
    *destination = *source;     //拷贝'\0'

	return ret;
}

 🎏运行测试

使用my_strcpy()函数将字符数组str1中的内容拷贝到str2数组中,以及使用my_strcpy()函数将常量字符串str4中的字符串拷贝到str3字符数组中:

vs2022中测试如下:

成功运行,最后我们测试一下函数遇到传参为NULL指针的情况:

可以看到,assert()成功抛出了异常,并终止了程序非法运行:


结语

希望这篇strcpy()函数的介绍到能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦是行人!一起学习,一起进步!

相关文章推荐

【C语言】rand()函数(如何生成指定范围随机数)

【C语言】memset()函数

【C语言】strlen()函数

【C语言】memcpy()函数

不想改bug?程序员必须学会使用的报错函数assert!(断言函数详解)

【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序



C语言字符串库函数思维导图:

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

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

相关文章

【数据结构练习】树和二叉树的选择题精选集锦

前言 编程想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#xff01;为此我开启了一个弯道超车必做好题锦集的系列&#xff0c;此为树和二叉树的选择题精选集锦。该系列会不定期更新&#xff0c;敬请期待&#xff01; 1.已知某二叉树的…

c++学习之搜索二叉树

目录 一&#xff0c;什么是搜索二叉树&#xff1f; 二&#xff0c;搜索二叉树的实现 非递归实现 节点与类成员 插入 查找 删除 递归实现 插入 查找 删除 一&#xff0c;什么是搜索二叉树&#xff1f; 搜索二叉树&#xff08;Binary Search Tree&#xff09;是一种常见…

jdbc 执行批处理任务

package com.csdn.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; //演示执行批处理任务 public class ExecuteBatchTask {public static void main(String[] args) throws ClassNotFou…

通过jsonobject.tostring 传字符串为有空格问题

目录 通过jsonobject.tostring 传字符串为有空格问题 1.问题原因解决思路解决方案总结参考 文章所属专区 项目问题解决 1.问题原因 通过JSONObject.toString()方法将字符串转换为JSON格式时&#xff0c;可能会出现空格的情况。这是因为JSONObject.toString()方法在生成JSON字…

理解什么是接口测试?怎样做接口测试?

一 什么是接口&#xff1f; 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。接口测试主要用于外部系统与系统之…

贪心算法学习——单调递增的数字

一&#xff0c;单调递增的数字 1.题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入…

【c++速通】入门级攻略:引用详解 | auto的类型推导 | 不一样的for循环 | nullptr版本空指针

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️引用☁️引用的概念☁️引用的特性⭐引用在定义时必须初始化 ☁️常引用…

javascript IP地址正则表达式

注&#xff1a; 一定不要把表达式赋值给变量&#xff0c;直接表达式.test() /^(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2})\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)$/g.te…

【转载】双亲委派模型

双亲委派模型是 Java 类加载器的一种工作模式&#xff0c;通过这种工作模式&#xff0c;Java 虚拟机将类文件加载到内存中&#xff0c;这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢&#xff1f;接下来我们一起来看。 1.类加载器 双亲委派模型针…

驱动开发6 IO多路复用——epoll

核心操作&#xff1a;一棵树、一张表、三个接口 相关案例 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys…

2022年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 关于Python语言的注释,以下选项中描述错误的是?( ) A: Python语言有两种注释方式:单行注释和多行注释 B: Python语言的单行注释以#开头 C: Python多行注释使用###来做为标记 D: …

RPA为什么会火起来?

RPA的前世今生 RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;&#xff0c;这项技术旨在模拟人类一系列应用软件中执行规则性的任务技术&#xff0c;通过精准、规范且搞笑的自动化处理过程&#xff0c;极大提高了日常业务开展的效率和准…

同一个页面同一区域两个el-table在v-if下样式重叠问题

&#x1f349;正常情况下在radio切换时两个表格的样式应如下 &#x1f349;实际上用v-if显示时会出现以下问题&#xff08;本该属于时间段相同模块的表格却出现在时间段自定义的表格中&#xff09; &#x1f349;解决方案&#xff1a; &#x1f343;一、将v-if替换成v-show(…

零基础Linux_23(多线程)线程安全+线程互斥(加锁)+死锁

目录 1. 线程安全 1.1 线程不安全前期 1.2 线程不安全原因 2. 线程互斥 2.1 加锁保护&#xff08;代码&#xff09; 2.2 锁的本质 3. 可重入对比线程安全 4. 死锁 4.1 死锁的必要条件 4.2 避免死锁 5. 笔试面试题 答案及解析 本篇完。 1. 线程安全 基于上一篇线程…

计算机网络(谢希仁)第八版课后题答案(第三章)

1.数据链路(即逻辑链路)与链路(即物理链路)有何区别? “电路接通了”与”数据链路接通了”的区别何在? 数据链路与链路的区别在于数据链路出链路外&#xff0c;还必须有一些必要的规程来控制数据的传输&#xff0c;因此&#xff0c;数据链路比链路多了实现通信规程所需要的硬…

​​​​​​​如何解决Google play开发者新注册账号,身份验证的地址证明问题?

我们知道&#xff0c;Google Play应用市场的发展速度惊人&#xff0c;但这两年&#xff0c;为了防止恶意软件的传播&#xff0c;谷歌要求开发者账号需要进行身份验证才能发布应用。 而今年越来越严格&#xff0c;不仅在提审时需要进行电话验证&#xff08;链接&#xff09;&am…

TCP三次握手具体过程

四次挥手 1&#xff09;客户端进程发出连接释放报文&#xff0c;并且停止发送数据。释放数据报文首部&#xff0c;FIN1&#xff0c;其序列号为sequ&#xff08;等于前已经传送过来的数据的最后一个字节的序号加1)&#xff0c;此时&#xff0c;客户端进入FIN_WAIT_1&#xff08…

Echarts柱状图渐变色问题变通

问题背景 设计稿中给出了如下图的效果&#xff0c;在柱状图的最上面给出了一个白色的小块&#xff0c;起初我一直在思考亦或者搜索相关的问题&#xff1a;如何在Echarts柱状图顶部实现一个24*4的白色矩形块。始终不得其解&#xff0c;在一个吃饭的瞬间冒出来一个想法是否可以用…

图像的特征点描述与提取

一、说明 特征点算法是图像处理中主要算法之一&#xff0c;它是图像物体匹配的关键步骤&#xff0c;因此&#xff0c;是个极其重要的题目&#xff0c;至今依旧研究不断&#xff0c;本篇讲述历年来学者在领域研究的突出贡献&#xff0c;即六种不同的特征点提取办法&#xff0c;供…