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

承接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 endscode 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=0mov 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.xdnf.cn/news/1534634.html

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

相关文章

CDGA|如何实施非常精准的数据治理策略?

在信息化高速发展的今天&#xff0c;数据已成为企业最重要的生产要素之一&#xff0c;其价值日益凸显。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何精准地管理和控制数据成为企业亟待解决的问题。本文将从设定目标、制定策略、组织结构建设、制度流程规范以及技术…

【大模型专栏—进阶篇】语言模型创新大总结——“三派纷争”

大模型专栏介绍 &#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文为大模型专栏子篇&#xff0c;大模型专栏将持续更新&#xff0c;主要讲解大模型从入门到实战打怪升级。如有兴趣&#xff0c;欢迎您的阅读。 &#x1f4…

【JAVA入门】Day36 - 异常

【JAVA入门】Day36 - 异常 文章目录 【JAVA入门】Day36 - 异常一、异常结构体系综述1.1 错误&#xff08;Error&#xff09;1.2 异常&#xff08;Exception&#xff09;1.3 运行时异常&#xff08;RuntimeException&#xff09;1.4 其他异常 二、编译时异常和运行时异常三、异常…

JAVA智能辅导因材施教家教系统小程序源码

探索“智能辅导因材施教家教系统”的奥秘 &#x1f680; 开篇&#xff1a;未来教育的新篇章 在这个日新月异的时代&#xff0c;教育也在悄然发生着变革。你是否厌倦了千篇一律的教学模式&#xff1f;渴望为孩子找到那个真正“懂他”的老师&#xff1f;今天&#xff0c;就让我带…

JavaDS —— LRUCache

概念 LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c; 通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂贵但较快速的SRAM技术。…

eHR软件好用吗?人事管理系统的功能有哪些?

随着科技的发展&#xff0c;企业管理方式也在不断变革。其中&#xff0c;电子人力资源管理&#xff08;eHR&#xff09;系统作为一种新兴的人力资源管理工具&#xff0c;受到了越来越多企业的关注。那么&#xff0c;eHR系统到底好不好用&#xff1f;它有哪些具体功能呢&#xf…

Zotero使用(一)PDF文件导入不会自动识别

上面两种&#xff0c;一种中文&#xff0c;一种英文&#xff0c;会发现&#xff0c;中文的导入进去之后不会自动识别&#xff0c;部分英文也是。不能自动识别就会缺少导出参考文献的功能&#xff0c;怎么办&#xff1f; 发现之前导入喜欢使用PDF格式 可以结合.ris格式&#xf…

如何使用ssm实现基于VUE3+SSM框架的在线宠物商城+vue

TOC ssm598基于VUE3SSM框架的在线宠物商城vue 第1章 绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在这个新的时代&#xff…

Python 课程5-NumPy库

在数据处理和科学计算中&#xff0c;NumPy 是一个非常强大且基础的库。除了基本的创建数组功能之外&#xff0c;NumPy 提供了许多强大的函数和方法&#xff0c;用于执行高级的矩阵运算、统计分析、逻辑操作等。以下是一些常用且非常有用的 NumPy 指令&#xff0c;涵盖了创建数组…

一个新目标:开始每日练习打字

前言 每日10行代码写了183篇&#xff0c;比最开始预想的要多&#xff0c;但比我理想的篇数要少&#xff0c;我理想的篇数是300篇以上。 python每日学写到了18篇&#xff0c;本来是准备每日学的&#xff0c;但是架不住生活无常&#xff0c;最终还是没有达成目标&#xff0c;不过…

软件研制功能点拆分

最近需要进行软件研制概算明细表中的估算对象原始功能点&#xff0c;记录一下学习过程&#xff0c;共有EI(external input 外部输入)、EO(外部输出)、EQ(外部查询)、ILF(internal logic 内部逻辑文件)、EIF(外部接口文件)五个。 功能点计数项分为数据功能&#xff08;逻辑文件&…

[linux基础知识]教你使用vim和ctags阅读linux内核源码

1 安装ctags apt install ctags 2 内核源码目录下添加索引 使用下面命令&#xff0c;添加索引成功后&#xff0c;内核目录下会生成tags 索引文件。 ctags -R 3 vim使用索引阅读源码 跳转到函数变量定义与返回 #跳到函数或者变量定义 Ctrl] #返回 Ctrlo 光标移动到需要…

python画图|3D参数化图形输出

前面已经学习了基本的3D作图&#xff0c;具体链接如下&#xff1a; 基础教程&#xff1a;python画图|3D图基础教程-CSDN博客 直方图教程&#xff1a;python画图|3D直方图基础教程-CSDN博客 垂线标记教程&#xff1a;python画图|3D垂线标记-CSDN博客 3D surface教程&#xf…

Kamailio-基于Homer与heplify的SIP信令监控-2

接上篇&#xff0c;我们已经顺利地完成了服务的安装&#xff0c;下面就来看看如何配置并启动。 跟着我&#xff0c;你将学会&#xff1a; 下载并安装 踩坑&#xff1a;按照官方步骤来&#xff0c;可是网络条件不允许 获取YUM源下载RPM包手动解压安装避坑 配置并启动&#xf…

如何计算光伏在安装过程中的损耗程度?

光伏系统在实际安装和运营过程中&#xff0c;会受到多种因素的影响&#xff0c;导致电能损耗。这些损耗包括线缆损耗、逆变器效率、组件品质、灰尘积累、入射角损失等。 一、光伏系统损耗的分类 光伏系统的损耗大致可以分为以下几类&#xff1a; 1、线缆损耗&#xff1a;光伏…

文件外发怎么保证安全

为了确保文件在外发过程中的安全&#xff0c;金刚钻信息网站的防泄密系统支持以下多种措施来防止数据泄露和未经授权的访问&#xff1a; 1. 文件加密 加密文件&#xff1a;在文件外发前对其进行加密处理&#xff0c;确保只有持有解密密钥或密码的人才能访问文件内容。加密工具…

uview-plus 表单校验 相关字段有数据有值的情况下非空验证失败问题

你们好&#xff0c;我是金金金。 场景 uniapp编写h5及小程序&#xff0c;组件库用的uview-plus&#xff0c;在进行表单校验的过程中&#xff0c;数据回显 数量明明是有值的&#xff0c;还是依旧提示填写数量&#xff08;重新再次手动输入才能校验通过&#xff0c;明显是存在问题…

电子电路产业园废水处理与资源回收的创新实践

随着电子产品的普及和技术革新步伐的加快&#xff0c;电子电路制造业已成为推动现代科技发展的关键力量之一。然而&#xff0c;随之而来的环保问题不容忽视。电镀工艺作为电子电路生产中的一个核心环节&#xff0c;其产生的含镍废水处理成为了企业必须面对的重要课题。本文将探…

Oracle发邮件功能:设置的步骤与注意事项?

Oracle发邮件配置教程&#xff1f;如何实现Oracle发邮件功能&#xff1f; Oracle数据库作为企业级应用的核心&#xff0c;提供了内置的发邮件功能&#xff0c;使得数据库管理员和开发人员能够通过数据库直接发送邮件。AokSend将详细介绍如何设置Oracle发邮件功能。 Oracle发邮…

悟空crm客户管理系统二次开发 单独新增表格字段

1&#xff0c;仪表盘&#xff08;数据来源修改&#xff09; 注意点&#xff1a;有层级关系&#xff0c;管理员账号可以看到全部数据&#xff0c;主管只能看到下属数据。 2、在客户管理菜单里面 增加一个时间筛选、额度汇总 /*** 获取客户列表** param $type* param $content*…