strcpy函数详解:字符串复制的利器

news2024/11/19 21:26:21

目录

一,strcpy函数的简介

二,strcpy函数的实现原理

三,strcpy函数的注意事项

四,strcpy函数的模拟实现


一,strcpy函数的简介

strcpy函数是C语言中的字符串复制函数,其原型如下:

char * strcpy ( char * destination, const char * source );
  • destination表示目标字符串的地址。
  • source表示源字符串的地址。
  • 函数的返回值为目标字符串的地址。
  • 头文件:#include <string.h>

使用strcpy函数的基本步骤如下:

  1. 确保目标字符串dest有足够的空间来存储源字符串src的内容。
  2. 调用strcpy函数,将源字符串src的内容(包括'\0')复制到目标字符串dest中。
  3. 返回目标字符串dest的地址。 

🍂示例代码: 

#include <stdio.h>
#include <string.h>

int main()
{
	char src[] = "Hello world!";
	char dest[20];

	strcpy(dest, src);
	printf("复制后的字符串为:%s\n", dest);

	return 0;
}

🎈运行结果:

二,strcpy函数的实现原理

1,检查源字符串src的第一个字符是否为'\0',若是,则直接返回目标字符串dest的地址。

2,通过循环遍历源字符串src,将每个字符依次复制到目标字符串dest中,直到遇到源字符串的结束符'\0'停止。

3,复制完成后,在目标字符串dest的末尾添加结束符'\0'。

4,返回目标字符串dest的地址。 

🍂注意:

 strcpy函数并不会检查目标字符串dest的容量是否足够,因此在使用strcpy函数时,务必确保目标字符串有足够的空间来存储源字符串的内容,以免发生缓冲区溢出的问题。

三,strcpy函数的注意事项

1,目标字符串必须有足够的空间来存储源字符串src的内容,负责可能会发生缓冲区溢出的问题。

#include <stdio.h>
#include <string.h>

int main()
{
	char dest[5] = "*****";
	char src[] = "Hello world!";

	strcpy(dest, src);
	printf("复制后的字符串为:%s\n", dest);
	return 0;
}

🎈运行结果: 

2,在使用strcpy函数时,应确保源字符串src以'\0'结尾,负责可能会导致复制结果不正确。

#include <stdio.h>
#include <string.h>


int main()
{
	char dest[5] = "*****";
	char src[] = { 'a', 'b', 'c' };

	strcpy(dest, src);
	printf("复制后的字符串为:%s\n", dest);
	return 0;
}

🎈运行结果:

可以看出程序最终崩溃了,这是因为src数组所在的内存空间后面存储的内容不知道是什么,而strcpy函数不遇到'\0'拷贝就不会停止,这就会导致越界访问,程序就会出现问题。 

3,当目标字符串dest和源字符串src重叠时,使用strcpy函数可能会导致未定义的行为,应避免这种情况的发生。

#include <stdio.h>
#include <string.h>


int main()
{
	char dest[5] = { "abcde" };
	char src[5] = { "abcde" };

	strcpy(dest, src);
	printf("复制后的字符串为:%s\n", dest);
	return 0;
}

🎈运行结果:

 

4,目标空间必须可变

#include <stdio.h>
#include <string.h>


int main()
{
	char* dest = "Hello world!";
	char src[5] = { "abcde" };

	strcpy(dest, src);
	printf("复制后的字符串为:%s\n", dest);
	return 0;
}

 🎈运行结果:

上面这段代码中dest指向的是常量字符串,是不可以被修改的,而目标空间必须是可以被修改的,因为要将拷贝的字符串放在目标空间中,所以程序会崩溃。 

四,strcpy函数的模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
    //拷贝str指向的字符串到dest指向的空间,包含'\0'
	while (*dest++ = *src++)
	{
		;
	}

	return ret;//返回目标空间的起始地址
}

int main()
{
	char arr1[20];
	char arr2[] = "Hello world!";

	my_strcpy(arr1, arr2);
	printf("复制后的字符串为:%s\n", arr1);

	return 0;
}

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

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

相关文章

Linux中的wc命令

2023年10月6月&#xff0c;周五晚上 目录 wc命令的主要功能和用法如下:统计文件行数、字数和字节数只统计行数只统计字数只统计字节数 wc命令在Linux/Unix系统中是word count的缩写,它用来统计文件的行数、字数和字节数。 wc命令的主要功能和用法如下: 统计文件行数、字数和字…

英语四六级高频核心词(故事版)

第一组&#xff1a;" A Century of Community Effort to Improve Quality of Life and Climate" In the early years of the 20th century, a small community found itself facing a decade of challenges. The most pressing issue was the mental quality of life…

VSC-HVDC直流输电matlab仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; VSC-HVDC直流输电仿真&#xff0c;换流站采用两电平结构&#xff0c;全控型器件&#xff08;IGBT&#xff09;&#xff0c;采用双环控制&#xff0c;包括电压外环&#xff0c;电流内环&#xff0c;分为d、q两…

【论文阅读】An Evaluation of Concurrency Control with One Thousand Cores

An Evaluation of Concurrency Control with One Thousand Cores Staring into the Abyss: An Evaluation of Concurrency Control with One Thousand Cores ABSTRACT 随着多核处理器的发展&#xff0c;一个芯片可能有几十乃至上百个core。在数百个线程并行运行的情况下&…

Springboot+vue的开放性实验室管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的开放性实验室管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的开放性实验室管理系统&#xff0c;采用M&#xff08…

基于SSM的家庭财务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

基于SSM的大学生就业信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

matlab之zeros函数语法与举例说明(附代码)

一、zeros函数语法与举例说明 &#xff08;1&#xff09;X zeros——返回标量0 X zeros 示例&#xff1a; &#xff08;2&#xff09;X zeros(n)——返回一个 nn 的全零矩阵 零矩阵&#xff1a; 示例&#xff1a;创建一个由零值组成的 33 矩阵 X zeros(3) &#xff08;…

《protobuf》基础语法3

文章目录 默认值更新规则保留字段未知字段 默认值 在反序列化时&#xff0c;若被反序列化的二进制序列中不包含某个字段&#xff0c;则在反序列化时&#xff0c;就会设置对应默认值。不同的类型默认值不同&#xff1a; 类型默认值字符串“”布尔型false数值类型0枚举型0设置了…

基于SSM的旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

国庆看坚如磐石

坚如磐石上映了&#xff0c;可以在爱奇艺观看。 而博主在使用蓝牙耳机连接电脑的过程中&#xff0c;发现没有蓝牙开启选项&#xff0c;并且在服务的设备管理器中也没有找到&#xff0c;很明显这是缺少驱动导致的&#xff0c;因此便去联想官方网站下载对应的驱动。 这里可以输入…

二分查找:34. 在排序数组中查找元素的第一个和最后一个位置

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路1. 暴力查找2. 一次二分查找 部分遍历3. 两次二分查找分别查找左右端点1.查找区间左端点2. 查找区间右端点 三、代码实现总结 前言 本篇文…

GCN详解

a ⃗ \vec{a} a 向量 a ‾ \overline{a} a 平均值 a ‾ \underline{a} a​下横线 a ^ \widehat{a} a (线性回归&#xff0c;直线方程) y尖 a ~ \widetilde{a} a a ˙ \dot{a} a˙ 一阶导数 a \ddot{a} a 二阶导数 H(l)表示l层的节点的特征 W(l)表示l层的参数 D ~ \widet…

Kafka客户端核心参数详解

这一部分主要是从客户端使用的角度来理解 Kakfa 的重要机制。重点依然是要建立自己脑海中的 Kafka 消费模型。Kafka 的 HighLevel API 使用是非常简单的&#xff0c;所以梳理模型时也要尽量简单化&#xff0c;主线清晰&#xff0c;细节慢慢扩展。 一、从基础的客户端说起 Kaf…

iphone怎么传大量照片到电脑,这四招你要学会

如果你喜欢用iPhone拍照、总会遇到要把大量照片从iPhone传输到电脑的情况&#xff0c;要是你对这方面不熟悉就很容易浪费时间。下面小编就介绍几种方法可以快速高效的传大量照片到电脑上去。 iPhone传输照片到电脑 方法一&#xff1a;使用iMazing传输 推荐度★★★★★ 有了i…

操作系统八股

1、请你介绍一下死锁&#xff0c;产生的必要条件&#xff0c;产生的原因&#xff0c;怎么预防死锁 1、死锁 两个或两个以上的进程在执行过程中&#xff0c;因争夺共享资源而造成的一种互相等待的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处…

【Spring Boot】日志文件

日志文件 一. 日志文件有什么用二. 日志怎么用三. ⾃定义⽇志打印1. 在程序中得到⽇志对象2. 使⽤⽇志对象打印⽇志3. ⽇志格式说明 四. 日志级别1. ⽇志级别有什么⽤2. ⽇志级别的分类与使⽤ 五. 日志持久化六. 更简单的⽇志输出—lombok1. 添加 lombok 依赖2. 输出⽇志3. lom…

(六)正点原子STM32MP135移植——内核移植

目录 一、概述 二、编译官方代码 三、移植 四、编译 一、概述 前面已经移植好了TF-A、optee、u-boot&#xff0c;在u-boot能正常跑起来的情况下&#xff0c;现在来移植内核。 二、编译官方代码 进入kernel目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf linux-6.1.28.…

【算法|动态规划No.13】leetcode LCR 166. 珠宝的最高价值

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…