当前位置: 首页 > 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;移…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...