【C语言】strcpy()函数(字符串拷贝函数详解)
🦄个人主页:修修修也
🎏所属专栏: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";//创建一个常量字符串指针str4printf("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!(断言函数详解)
https://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语言字符串库函数思维导图:

相关文章:
【C语言】strcpy()函数(字符串拷贝函数详解)
🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.strcpy()函数简介 1.函数功能 2.函数参数 1>.char * destination 2>.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用s…...
机器学习之IV编码,分箱WOE编码
IV的概念与作用 全称是Information Value,中文的意思是信息价值,或者信息量作用: 1、构建分类模型时,经常需要对特征进行筛选。 2、挑选特征的过程考虑的因素比较多,最主要和最直接的衡量标准是特征的预测能力&#…...
区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第六套区块链系统部署与运维
第六套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 子任务1-2-1: 搭建区块链系统并验证 题意: P2P起始端口 30500 channel起始端口 20500 JSONRPC 8945 使用Docker配置 使用 build_chain.sh 文件 进行生成节点文件 root@192-168-19-133:/yijiu/mode6# bas…...
山西电力市场日前价格预测【2023-10-30】
日前价格预测 预测说明: 如上图所示,预测明日(2023-10-30)山西电力市场全天平均日前电价为309.35元/MWh。其中,最高日前电价为400.33元/MWh,预计出现在18:15。最低日前电价为0.00元/MWh,预计出…...
win10虚拟机安装教程
目录 1、安装VMware 10、12、16都可以,看个人选择 2、开始安装系统(以vm16为例) 3、在虚拟机中安装win10 完成 1、安装VMware 10、12、16都可以,看个人选择 下面链是我虚拟机安装包,需要可以下载。 YR云盘 软件安…...
2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据
2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据 1、时间:2011-2021年 指标:指标:股票代码、年份、行政区划代码、行业名称、行业代码、所属省份、所属城市、数字…...
CSP-J 2023 T3 一元二次方程 解题报告
CSP-J 2023 T3 一元二次方程 解题报告 Link 前言 今年 C S P CSP CSP的原题, 回家 1 h 1h 1h内写 A C AC AC, 但是考场上没有写出来 , 原因是脑子太不好了, 竟然调了两个小时没有调出来. 一等奖悬那… 正题 看完题目,第一眼就是大模拟, 并且 C C F CCF CCF绝对不会让你好受…...
中颖单片机SH367309全套量产PCM,专用动力电池保护板开发资料
方案总体介绍 整套方案硬件部分共2块板子,包括MCU主板,采用SH79F6441-32作为主处理器。MCU主板包括2个版本。PCM动力电池保护板采用SH367309。 软件方案采用Keil51建立的工程,带蓝牙的版本,支持5~16S电池。 硬件方案--MCU主板 MC…...
Android数据对象序列化原理与应用
序列化与反序列化 序列化是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换为字节流或文本格式,以便在不同的系统之间进行传输或存…...
Linux cp命令:复制文件和目录
cp 命令,主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能。 cp 命令的基本格式如下: [rootlocalhost ~]# cp [选项] 源文件 目标文件 选项: -a&…...
SpringBoot 接收不到 post 请求数据与接收 post 请求数据
文章归档:https://www.yuque.com/u27599042/coding_star/xwrknb7qyhqgdt10 SpringBoot 接收不到 post 请求数据 接收 post 请求数据,控制器方法参数需要使用 RequestParam 注解修饰 public BaseResponseResult<Object> getMailCode(RequestParam…...
vue3学习(十四)--- vue3中css新特性
文章目录 样式穿透:deep()scoped的原理 插槽选择器:slotted()全局选择器:global()动态绑定CSScss module 样式穿透:deep() 主要是用于修改很多vue常用的组件库(element, vant, AntDesigin),虽然配好了样式但是还是需要更改其他的样式就需要用…...
Python爬虫基础之Requests详解
目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址:https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由…...
C++求根节点到叶子节点数字之和
文章目录 题目链接题目描述解题思路代码复杂度分析 题目链接 LCR 049. 求根节点到叶节点数字之和 - 力扣(LeetCode) 题目描述 给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表…...
C++搜索二叉树
本章主要是二叉树的进阶部分,学习搜索二叉树可以更好理解后面的map和set的特性。 1.二叉搜索树概念 二叉搜索树的递归定义为:非空左子树所有元素都小于根节点的值,非空右子树所有元素都大于根节点的值,而左右子树也是二叉搜索树…...
软件工程17-18期末试卷
2.敏捷开发提倡一个迭代80%以上的时间都在编程,几乎没有设计阶段。敏捷方法可以说是一种无计划性和纪律性的方法。错 敏捷开发是一种软件开发方法论,它强调快速响应变化、持续交付有价值的软件、紧密合作和适应性。虽然敏捷方法鼓励迭代开发和灵活性&…...
课题学习(九)----阅读《导向钻井工具姿态动态测量的自适应滤波方法》论文笔记
一、 引言 引言直接从原论文复制,大概看一下论文的关键点: 垂直导向钻井工具在近钻头振动和工具旋转的钻井工作状态下,工具姿态参数的动态测量精度不高。为此,通过理论分析和数值仿真,提出了转速补偿的算法以消除工具旋…...
阿里云服务器—ECS快速入门
这里对标阿里云的课程,一步步学习,链接在下面,学习完考试及格即可获取阿里云开发认证和领取证书,大家可以看看这个,这里我当作笔记,记一下提升印象! 内容很长,请耐心看完࿰…...
Hive简介及核心概念
本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.简介 Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。 …...
CrossOver 23.6.0 虚拟机新功能介绍
CrossOver 23.6.0 Mac 此应用程序允许您运行为 Microsoft Windows 编写的程序,而无需实际安装操作系统。 CrossOver 23.6.0 Mac 包括一个 Windows 程序库,用于它可以运行的 Windows 程序。 您会发现非常流行的应用程序,例如 Microsoft Word…...
nvm-desktop技术深度解析:跨平台Node.js版本管理架构设计
nvm-desktop技术深度解析:跨平台Node.js版本管理架构设计 【免费下载链接】nvm-desktop Node Version Manager Desktop - A desktop application to manage multiple active node.js versions. 项目地址: https://gitcode.com/gh_mirrors/nv/nvm-desktop nvm…...
本地部署 Open Claw 保姆教程,同事还在手动整理文件,我已经让 AI 全搞定了
前言 2026 年开源圈热门的「数字员工」OpenClaw(昵称小龙虾),GitHub 星标超 28 万,凭「本地运行 零代码操作 自动干活」的优势圈粉无数!很多人误以为它是普通聊天 AI,实则是能真正操控电脑的自动化神器 …...
FastbootEnhance:Windows平台终极Fastboot工具箱与Payload提取器完整指南
FastbootEnhance:Windows平台终极Fastboot工具箱与Payload提取器完整指南 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 你是否曾经因…...
给电力行业装上“地理大脑”:百度智能云图云做了一次“地址大模型”变革
“我家在老三中对面那条巷子,供电局以前的老院子旁边……”当95598客服接到这样的报修电话时,系统该如何精准定位?这并非个例。城市快速扩张、街巷小区不断新建更名,而电力系统的地址数据往往跟不上现实变化。同时,传统…...
量子退火与经典优化算法性能对比研究
1. 量子退火与经典优化算法的性能对比研究在计算科学领域,量子计算一直被视为可能带来革命性突破的技术。其中,量子退火(Quantum Annealing)作为一种专门用于解决组合优化问题的方法,近年来备受关注。然而,…...
图片去水印怎么做?2026年最全图片去水印工具推荐与方法盘点
在日常工作和生活中,我们常常会遇到带有水印的图片——无论是社交平台的截图、素材库的图片,还是从各类网站下载的资源。水印虽然保护了原作者的权益,但有时也会影响我们对内容本身的使用。那么,图片去水印有哪些实用方法…...
精准监测,畅行无阻——DX-SZ3200系列在交通领域的应用
在铁路、高速及各类交通系统中,信号监测与管理的精准性和实时性至关重要。DX-SZ3200系列数字化射频实时频谱侦测接收机模块,凭借其卓越的性能和广泛的应用场景,成为了交通领域信号监测的得力助手。DX-SZ3200系列模块集成了先进的数字化射频接…...
3步解锁网易云音乐NCM文件:免费转换工具终极指南
3步解锁网易云音乐NCM文件:免费转换工具终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的NCM格式音乐无法在其他设备…...
DeepSeek V2多模态支持真相(官方未公开的API隐藏能力全披露)
更多请点击: https://codechina.net 第一章:DeepSeek V2多模态支持真相(官方未公开的API隐藏能力全披露) DeepSeek V2 官方文档明确声明为纯文本大模型,但逆向分析其生产环境 API 流量与响应头后发现:其底…...
【飞机】基于matlab数据驱动的多传感器飞机健康监测系统【含Matlab源码 15551期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
