【C语言】_字符串拷贝函数strcpy

目录

1. 函数声明及功能

2. 使用示例

3. 注意事项

4. 模拟实现

4.1 第一版:基本功能+判空+const修饰

4.2 第二版:优化对于'\0'的单独拷贝

4.3 第三版:仿strcpy的char*返回值


1. 函数声明及功能

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

 strcpy功能:字符串拷贝

2. 使用示例

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "hello world";
	char arr2[15] = {0};
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

3. 注意事项

1、拷贝源字符串时,以'\0'作为拷贝结束标志,且将'\0'也拷贝到目标空间,可通过将目标空间初始化为非0字符来验证:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "hello world";
	char arr2[15] = "xxxxxxxxxxxxxxx";
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

调试监视arr数组各元素 :

2、目标空间必须足够大以接收源字符串,否则程序会报错

3、目标空间内容必须可修改(常量字符串、const修饰的变量等均不可作为目标空间):

4. 模拟实现

4.1 第一版:基本功能+判空+const修饰

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
void my_strcpy1(char* dest, const char* src) {
	assert(src != NULL);
	assert(dest != NULL);
	// 拷贝'\0'之前的内容
	while (*src != '\0') {
		*dest = *src;
		src++;
		dest++;
	}
	// 拷贝'\0'
	*dest = *src;
}
int main() {
	char arr1[] = "hello world";
	char arr2[15] = { 0 };
	my_strcpy1(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

4.2 第二版:优化对于'\0'的单独拷贝

#include<assert.h>
void my_strcpy2(char* dest, const char* src) {
	assert(src != NULL);
	assert(dest != NULL);
	while (*dest++ = *src++) {
		;
	}
}
int main() {
	char arr1[] = "hello world";
	char arr2[15] = { 0 };
	my_strcpy2(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

注:虽然++的优先级高于*,但由于为后置++,故*dest++实际上是对dest解引用后再++;

 将*dest++ = *src++ 置于while判断条件中,由于判断条件需先执行后判断,

while (*dest++ = *src++) 写法既完成了\0的拷贝,也使得条件为假跳出循环;

4.3 第三版:仿strcpy的char*返回值

查strcpy文档,关于其参数及返回值介绍如下:

返回类型为char*,返回值为destination,即目标空间的起始地址;

cplusplus.com网址如下:

strcpy - C++ Referenceicon-default.png?t=O83Ahttps://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy现修改代码如下:

#include<stdio.h>
#include<assert.h>
char* my_strcpy3(char* dest, const char* src) {
	assert(src != NULL);
	assert(dest != NULL);
	char* ret = dest;
	while (*dest++ = *src++) {
		;
	}
	return ret;
}
int main() {
	char arr1[] = "hello world";
	char arr2[15] = { 0 };
	my_strcpy3(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

XML序列化和反序列化的学习

1、基本介绍 在工作中&#xff0c;经常为了调通上游接口&#xff0c;从而对请求第三方的参数进行XML序列化&#xff0c;这里常使用的方式就是使用JAVA扩展包中的相关注解和类来实现xml的序列化和反序列化。 2、自定义工具类 import javax.xml.bind.JAXBContext; import javax.x…

js使用qrcode与canvas生成带logo的二维码

qrcode库 文档 https://www.npmjs.com/package/qrcode 安装 npm i qrcode 使用 errorCorrectionLevel: H // 容错率&#xff08;H是最高&#xff0c;其它看文档&#xff09; width: 200 // 大小 margin: 2 // 边距 import QRCode from qrcodeconst testFn async () > {c…

【计算机网络】lab5 ARP协议

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

【React】脚手架进阶

目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装&#xff0c;如何暴露这些打包配置呢&#xff1f;上篇写到在package.json中的scripts配置项中有eje…

java项目之现代企业人力资源管理系统设计与实现(源码+文档)

大家好我是风歌&#xff0c;今天要和大家聊的是一款基于ssm的现代企业人力资源管理系统设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 现代企业人力资源管理系统设计与实现的主要使用者分为管理员、经理和普通员工三个角…

2025.1.15——三、报错注入

一、基本操作&#xff1a;整理已知信息&#xff0c;本题为报错注入&#xff0c;需进一步确认回显方式 二、用updatexml()解题步骤 step 1&#xff1a;依据回显方式判断题目类型 键入&#xff1a;1、1 and 11 、id2-1 得到&#xff1a;查询正确的回显 键入&#xff1a;1’、…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中&#xff0c;由于项目涉及的类过多&#xff0c;以至于我们会打开很多的窗口。使用IDEA默认的配置&#xff0c;个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

自己动手搭建“接入 AI Agent 的数字人”

前言 本文的实战案例来自于开源项目&#xff1a;https://github.com/wan-h/awesome-digital-human-live2d。该项目可以运用Dify编排框架和Live2D驱动模型搭建智能数字人&#xff0c;实现智能对话并动态交互&#xff0c;大家可以自行部署尝试&#xff0c;项目效果如下。 开源&a…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…

电脑有两张网卡,如何实现同时访问外网和内网?

要是想让一台电脑用两张网卡&#xff0c;既能访问外网又能访问内网&#xff0c;那可以通过设置网络路由还有网卡的 IP 地址来达成。 检查一下网卡的连接 得保证电脑的两张网卡分别连到外网和内网的网络设备上&#xff0c;像路由器或者交换机啥的。 给网卡配上不一样的 IP 地…

dockerfile2.0

dockerfile实现lnmp nginx centos7 mysql centos7 php centos7 自定义镜像来实现整个架构 cd /opt mkdir nginx mysql php cd nginx 拖入nginx和wordpress vim Dockerfile vim nginx.conf ↓ worker_processes 1; events {worker_connections 1024; } http {include …

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库&#xff1a; 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图&#xff0c;该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件&#xff0c;文件内容及各配置项内容如下图&#xff0c;需要先将配置项【skip-grant-tab…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

在Linux上如何让ollama在GPU上运行模型

之前一直在 Mac 上使用 ollama 所以没注意&#xff0c;最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了&#xff0c;因为 Mac 上如果超内存的话&#xff0c;那么就只用 CPU&#xff0c;但是我发现 Llama3.2 3B 只占用 3GB&#xff0c;这远没有超。看了一下命…

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的&#xff0c;用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此&#xff0c;如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用&#xff0c;那…

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库&#xff0c;如下图&#xff1a; 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境&#xff1a; 1. 安装和配置Prometheus&#xff1a; - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…

适配器模式案例

如果在这样的结构中 我们在Controller中注入&#xff0c;但我们后续需要修改Oss时&#xff0c;比如从minioService改成AliyunService时&#xff0c;需要改动的代码很多。于是我们抽象出一个FileService&#xff0c;让controller只跟fileservice耦合&#xff0c;这样我没只需要在…

AI大模型语音交互方案,ESP32-S3联网通信,设备智能化响应联动

在科技日新月异的当下&#xff0c;人工智能与物联网技术正以前所未有的速度重塑着我们的生活&#xff0c;玩具和潮玩领域也迎来了翻天覆地的变化。 AI语音交互在玩具和潮玩产品中的应用越来越广泛&#xff0c;ESP32-S3凭借其高性能、低功耗、丰富的外设接口和强大的AI能力&…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle&#xff08;app模块&#xff09;里引入依赖&#xff0c;然后Sync Now一下&#xff1a; android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…

掌握Golang strings包:高效字符串处理指南

掌握Golang strings包&#xff1a;高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接&#xff1a;Join重复字符串&#xff1a;Repeat修改字符串&#xff1…