当前位置: 首页 > news >正文

【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!(断言函数详解)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语言字符串库函数思维导图:

相关文章:

【C语言】strcpy()函数

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.strcpy()函数简介 1.函数功能 2.函数参数 1>.char * destination 2>.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用s…...

C++基础算法⑦——信奥一本通递归算法(放苹果、求最大公约数问题、2的幂次方表示、分数求和、因子分解、判断元素是否存在)

递归算法 1206&#xff1a;放苹果1207&#xff1a;求最大公约数问题1208&#xff1a;2的幂次方表示1209&#xff1a;分数求和1210&#xff1a;因子分解1211&#xff1a;判断元素是否存在 1206&#xff1a;放苹果 这道题还是有些难度的&#xff0c;我们要考虑几种放苹果的情况。…...

uni-app医院智能导诊系统源码

随着科技的迅速发展&#xff0c;人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中&#xff0c;智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用&#xff0c;分析其优势和未来发展趋势。 智能导诊系统通过人工…...

启动jar时指定nacos配置

背景 由于需要在不同服务上部署应用&#xff0c;避免频繁打包&#xff0c;需要在jar启动时灵活配置naocs配置 启动命令 java -Xms256m -Xmx512m -Dfile.encodingutf-8 -jar mes-gateway-1.0.1.jar --spring.cloud.nacos.discovery.server-addrhttp://127.0.0.1:8848 --spri…...

linux安装vscode vscode使用 创建项目并运行

下载 https://code.visualstudio.com/ 下载.deb文件 安装 假如文件被下载到了 /opt目录下 进入Opt目录&#xff0c;右键从当前目录打开终端。 输入下面的安装命令。 sudo apt-get install ./code_1.83.1-1696982868_amd64.deb 安装成功。 安装插件 使用c&#xff0c;必…...

如何解决数据倾斜

星光下的赶路人star的个人主页 臣书刷字墨淋漓&#xff0c;舒卷烟云势最奇 文章目录 1、数据倾斜的现象2、解决办法2.1 单表聚合&#xff08;group bysum()&#xff09;2.2 多表关联&#xff08;join&#xff09; 3、倾斜原因 1、数据倾斜的现象 部分Reduce一直运行&#xff0…...

宏定义实现offsetof

在C语言中&#xff0c;有这样一个特殊的宏&#xff0c;叫offsetof&#xff0c;它的功能是啥呢&#xff1f; 我们来看看它的介绍 它的功能是&#xff1a;返回一个结构体的成员的大小&#xff08;相较于起始地址的偏移量&#xff09; 引用代码&#xff1a;http://t.csdnimg.cn…...

YOLOv5— Fruit Detection

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营-第7周&#xff1a;咖啡豆识别&#xff08;训练营内部成员可读&#xff09; &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https…...

(PyTorch)PyTorch中的常见运算(*、@、Mul、Matmul)

1. 矩阵与标量 矩阵&#xff08;张量&#xff09;每一个元素与标量进行操作。 import torch a torch.tensor([1,2]) print(a1) >>> tensor([2, 3]) 2. 哈达玛积&#xff08;Mul&#xff09; 两个相同尺寸的张量相乘&#xff0c;然后对应元素的相乘就是这个哈达玛…...

cmd 命令关闭占用端口

工作中还是偶尔会遇到端口号被占用的情况&#xff0c;之前也有写过另一种关闭方式&#xff0c;但是发现没有命令方便&#xff0c;所以记录一下。 1、 查看 8081 端口占用的 pid 。 命令&#xff1a;netstat -ano |findstr 8081 由上图可知&#xff0c;占用 8081 端口的进程 id…...

PG14启动报错“max_stack_depth“ must not exceed 7680kB

问题描述 PG14编译安装后启动报错"max_stack_depth" must not exceed 7680kB [roottop132:/pgdb/data]$ systemctl start postgres Job for postgres.service failed because the control process exited with error code. See "systemctl status postgres.se…...

BES2700 蓝牙协议之RFCOMM通道使用方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 BES2700 RFCOMM通道使用方法 RFCOMM_CHANNEL_NUM 枚举定义了一系列的通道号码,并为每个通道号码指定了一个具体的名称。以下是其中一些通道的中文含义: RFCOMM_CHAN…...

简单介绍一下迁移学习

迁移学习是一种机器学习技术&#xff0c;旨在利用从一个任务或领域学习到的知识来改善另一个任务或领域的学习性能。在传统的机器学习方法中&#xff0c;通常假设训练数据和测试数据是从相同的分布中独立同分布采样的。然而&#xff0c;在现实世界中&#xff0c;这个假设并不总…...

PHP 同城服务共享茶室小程序系统是如何实现的?

随着互联网的快速发展和共享经济的兴起&#xff0c;同城服务共享茶室作为一种新型的商业模式&#xff0c;越来越受到人们的关注。通过开发一款基于PHP的同城服务共享茶室小程序系统&#xff0c;可以提供更加便捷、高效、个性化的服务体验。本文将详细介绍PHP同城服务共享茶室小…...

JavaScript对象与原型

目录 对象的创建 原型与原型链 原型继承 总结 在JavaScript中&#xff0c;对象是非常重要的概念之一。它们允许我们以一种结构化的方式存储和组织数据&#xff0c;并提供了一种方便的方式来操作和访问这些数据。而对象的行为和属性则通过原型来定义。 对象的创建 在JavaS…...

论文解读:《DataPype:用于计算机辅助药物设计的全自动统一软件平台》

论文解读&#xff1a;《DataPype: A Fully Automated Unified Software Platform for Computer-Aided Drug Design》 1.文章概述2.背景2.方法2.1 DataPype概述2.2 数据2.3 分子和蛋白质数据的处理2.3.1 配体处理2.3.2 蛋白质加工 2.4 CADD方法2.5 基准研究2.5.1 单个 CADD 制备…...

2023年Flutter教程_Flutter+Getx仿小米商城项目实战视频教程-V3版

Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发。 GetX 是 Flutter 上的一个轻量且强大的解…...

【Spring Boot系列】- Spring Boot事务应用详解

【Spring Boot系列】- Spring Boot事务应用详解 一、事务简介 事务&#xff08;Transaction&#xff09;是数据库操作最基本单元&#xff0c;逻辑上一组操作&#xff0c;要么都成功。如果有一个操作失败。则事务操作都失败&#xff08;回滚&#xff08;Rollback&#xff09;&…...

28. 使用 k8e 玩转 kube-vip with Cilium‘s Egress Gateway 特性

因为在私有云环境下,我们需要保障集群服务 APIServer地址的高可用,所以提供的方案就是使用一个 VIP 让 API Server 的流量可以负载均衡的流入集群。另外,kube-vip 还支持 Service LB,方便SVC 服务的负载均衡,结合 cilium Egress Gateway 特性可以做到集群内的容器对外访问…...

webrtc ios build signing

构建命令 $ gn gen out/ios --argstarget_os"ios" target_cpu"arm64" rtc_include_testsfalse --idexcode报错&#xff0c;这个错误是因为存在多个签名的问题&#xff0c;通过错误信息知道其中有一个是无效的&#xff08;被吊销&#xff09;&#xff0c;移…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...