51.【C语言】字符函数和字符串函数(strcpy函数)

news2025/1/10 20:20:32

承接50.【C语言】字符函数和字符串函数(上) 点我跳转

5.strcpy函数

*简单使用

cplusplus的介绍 点我跳转

strcpy:string copy

翻译:

复制字符串

复制由source指向的C字符串到由destionation指向的数组中,包括\0(终止0字符)(在\0那里停止复制)

为了防止溢出,由destionation指向的数组的空间大小必须足够大,以至于能包含作为source的C字符串(含\0),而且不应该覆盖source的内存

参数

destination:指向将要复制内容的destination数组的指针

source:要被复制的C字符串

返回值

destination已经被返回(目标空间的起始地址)

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

 解释:strcpy(目标,源头);//目标和源头都是char*类型

strcpy(目标,源头);类似汇编的movsbmovsw

汇编中通常以rep和movsb或rep和movsw结合的方式来批量转移字符

movsb(move string byte)

movsw(move string word)

这两个指令都是从DS:SI地址处的数据传送到ES:DI地址处的数据

8086汇编代码示例

(用DOSBox的masm编译)

assume cs:code

;定义源头数据段,以byte形式填写,source为数据段的标号
source segment
db 'H','e','l','l','o',' ','W','o','r','l','d','!' 
source ends

;为目标数据段留空间,以byte形式填写,destination为数据段的标号
destination segment
destination: db 0,0,0,0,0,0,0,0,0,0,0,0,0
destination ends

code segment
start:
mov ax,source
mov ds,ax ;ds为source段的段地址

mov ax,destionation
mov es,ax ;es为destination段的段地址

cld  ;设置正方向传输

xor si,si ;si=0
xor di,di ;di=0

mov cx,12 ;设置循环次数为12(Hello World刚好12个字符)

rep movsb ;重复12次传送 每执行一次该指令,si和di自动+1,cx自动-1
code ends
end

注意:上面的 ; 为注释符号

C代码示例

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>string头文件包含strcpy
int main()
{
	char arr1[] = { "Hello World!"};
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);//注意\0也复制
	printf("%s", arr2);
	return 0;
}

由于arr1和arr2代表数组首元素的地址,因此可以使用strcpy

注意:1.arr2要预留足够的空间!

        2.注意字符串结束标志\0也复制,而且是复制结束的标志!!!在使用的过程中防止越界访问!

        3.目标空间必须可以修改(如常量字符串不可修改)

*模拟实现

设计一个函数sim_strcpy

destination简写为dest  source简写为src

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void sim_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest = *src;//解引用,字符复制
		dest++;//指针移动
		src++;//指针移动
	}//字符串结尾的\0没有复制,因此要另加一行
	*dest = *src;
}
int main()
{
	char arr1[] = { "Hello World!"};
	char arr2[20] = { 0 };
	//像strcpy一样设置两个参数
	sim_strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

 

*优化

01.简化代码1

*dest = *src;
dest++;
src++;

可以直接写为

*dest++ = *src++;

因此为

while (*src != '\0')
	{
	  *dest++ = *src++;
	}//字符串结尾的\0没有复制,因此要另加一行
	*dest = *src;

 

可以看到改变前后的汇编指令没有差别,除了最后三行

02.简化代码2

 直接写为

while (*dest++ = *src++)//先复制,再判断
	{
	  
	}

先复制一个字符,如果表达式的结果为真,即复制的该字符不为\0,则继续循环,否则结束循环

03.继续修改代码

发现sim_str函数和strcpy有一处不像的地方4

strcpy的返回类型为char*,而sim_strlen返回类型为void

因此改为

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char* sim_strcpy(char* dest, char* src)
{
	char* ret = dest;//存储目标空间的起始地址
	while (*dest++ = *src++)
	{

	}
	return ret;
}
int main()
{
	char arr1[] = { "Hello World!"};
	char arr2[20] = { 0 };
	//像strcpy一样设置两个参数
	char* ret = sim_strcpy(arr2, arr1);
	printf("%s", ret);//从ret地址处开始,向后以%s打印
	return 0;
}

附:string.h包含的函数

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

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

相关文章

深入内核分析BindException异常原因

一、前言 前段时间公司内的站点发布时经常遇到Tomcat使用的8080端口被占用&#xff0c;导致启动报错BindException的情况。笔者参与了该问题的排查和修复&#xff0c;本文将深入Tomcat、OpenJDK、Linux内核等源码为大家讲解问题的原因以及排查过程。 报错信息 Caused by: java…

收到了大厂中秋礼盒,哪家赢了?

大家好&#xff0c;我是鸭鸭&#xff01; 中秋节越来越近啦&#xff0c;大家都收到放假通知和中秋月饼了吗&#xff1f; 各大互联网品牌大厂的中秋创意礼盒也来啦&#xff01; 字节 今年字节的中秋礼盒&#xff0c;除了广州酒家的月饼之外&#xff0c;还发了一床2m*2.3m的四…

INDEMIND:扫地机器人,仍然不够“香”

不仅需要“新花样”&#xff0c;还要搞好“基本功”。 行业祛魅&#xff0c;重啃技术战 正如所有人都知道市场会发生变化&#xff0c;但扫地机器人的陡然降温还是给大多数人上了一课。尽管到了2023年&#xff0c;市场有所复苏&#xff0c;但零售量的增长也仅为4%。一时间&…

医药|基于springboot的医药管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已…

基于vue框架的宠物管理平台的设计与实现f3193(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,医院简介,养宠知识,宠物分类,医生,预约医生,医嘱记录,宠物用品,用品分类,购买记录,供应商,宠物信息 开题报告内容 基于Vue框架的宠物管理平台的设计与实现开题报告 一、引言 随着宠物经济的兴起&#xff0c;宠物管理成为了一个日…

Win11+Ubuntu20.04双系统安装教程(避坑版)

Win11Ubuntu20.04双系统安装教程&#xff08;避坑版&#xff09; 前言系统盘制作安装Rufus系统盘制作 Windows磁盘配置移动分区&#xff08;磁盘分区时出现不连续的未分配空间需要用到&#xff0c;如果是连续的未分配空间即无需操作&#xff09;安装分区助手移动分区 安装Ubunt…

Redis的IO模型

Redis IO模型 Redis IO模型 使用的是基于 Reactor 模式的 I/O 多路复用模型。这个模型通过单线程事件循环来处理所有的客户端请求和响应。 基本模式 1. Reactor 模式 Reactor 模式是一种用于处理并发 I/O 操作的设计模式。它包含以下几个组件&#xff1a; 多路复用器&…

构建高效入学审核系统:Spring Boot解决方案

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学生入学审核系统的相关信息成为必然。开…

redis常见的数据类型?

参考&#xff1a;一文读懂Redis五种数据类型及应用场景 - 知乎 (zhihu.com) String 类型 String 类型&#xff1a;Redis 最基本的数据类型&#xff0c;它是二进制安全的&#xff0c;意味着你可以用它来存储任何类型的数据&#xff0c;如图片、序列化对象等。使用场景&#xff…

OceanBase 运维管理工具 OCP 4.x 升级:聚焦高可用、易用性及可观测性

可视化的管控平台&#xff0c;对 OceanBase 这类的分布式数据库及大规模数据的运维管理来说&#xff0c;是提升运维效率与数据库管理水平的重要工具。OceanBase 运维管理工具 OCP 作为专为OceanBase数据库设计的企业级全生命周期管理平台&#xff0c;为用户提供了全面的数据库可…

句子成分——每日一划(六)

顺手简答一划&#xff1a;And&#xff1a;连词 you&#xff1a;主语 my friend&#xff1a;插入语 you&#xff1a;对主语起强调作用 are&#xff1a;系动词 the real hero&#xff1a;表语 目录 一、原句 二、独立成分&#xff0c;状语(Adverbial Phrase) 三、条件状语从…

Leetcode面试经典150题-82.删除排序链表中的重复元素II

之前写过这个题的基础第83题&#xff0c;看本文之前一定要先看懂这个Leetcode面试经典150题-82.删除排序链表中的重复元素II前序-83.删除排序链表中的重复元素_删除链表中重复的元素-CSDN博客 直接上代码了&#xff0c;解法都在代码里&#xff0c;不懂就留言或者私信 /*** De…

电机驱动开发之驱动板

目录 1.主要器件选型2.原理图设计3.PCB绘制电源调理驱动电路电流反馈位置反馈 4.PCB绘制5.打板验证6.总结 1.主要器件选型 器件参数封装理由LDOLM317DCYR &#xff08;24V-12V 12V-5V&#xff09;SOT-223小电流应用 LDO比DCDC噪声小响应快更为稳定预驱FD6288TTssop-20常见无刷…

独立站新纪元:破局而出,共绘可持续发展蓝图

随着全球电商市场的日益繁荣与平台竞争的加剧,独立站作为商家自主掌控品牌与市场的桥头堡,正面临着前所未有的挑战与机遇。在这个瞬息万变的时代,如何在平台垄断的阴影下突围而出,实现可持续增长,成为了每一位独立站商家亟需解答的课题。为此,店匠科技( Shoplazza ) 将于 9月 2…

基于SpringBoot+Vue的高校竞赛管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

2024年程序员接单平台汇总,程序员偷偷赚钱的机会来了!

作为技术创新的推动者和代码的创造者&#xff0c;程序员的影响力早已跨越国界。来到2024年&#xff0c;程序员不仅着眼于眼前的一亩三分地&#xff0c;也慢慢将眼光投向了外包接单。 程序员外包接单作为程序员副业的一种常见形式&#xff0c;给程序员带来了更多的选择&#xf…

C盘维护和清理心得(磁盘清理亲身实践)

01 安装软件前要自定义 安装软件都是默认C盘 通常可以选择安装储存位置至于应用数据会自动存在C盘&#xff0c;但一般并不大 02 安装后自定义存储位置 各种储存位置当然也默认C盘&#xff0c;通常分为下载位置和缓存位置 最经典的微信&#xff0c;QQ&#xff0c;钉钉等社交…

后台数据库查询记录

一、根据日期按天分组查询倒序 //mapper public List<Date> dateByPatientId(FollowScheme followScheme); <select id"dateByPatientId" parameterType"com.ruoyi.follow.domain.FollowScheme" resultType"java.util.Date">SELECT…

Redis:发布(pub)与订阅(sub)实战

前言 Redis发布订阅&#xff08;Pub/Sub&#xff09;是Redis提供的一种消息传递机制&#xff0c;它使用“发布者-订阅者”&#xff08;publisher-subscriber&#xff09;模式来处理消息传递。在这种模式下&#xff0c;发布者将消息发布到一组订阅者中&#xff0c;而无需关心谁…

C++八股总结(不间断更新)

数据类型和大小&#xff08;32位和64位&#xff09; char&#xff1a;1字节 1字节 short&#xff1a;2字节 2字节 int&#xff1a;4字节 4字节 long&#xff1a;4字节 8字节 long long&#xff1a;8字节 8字节 new-delete malloc-free new是C中的关键字。new可以根据动态分配内…