C 语言 strcpy 函数的进阶之旅

news2025/1/8 12:06:19

文章目录

  • 一、`my_strcpy`函数功能
  • 二、函数类型
  • 三、函数使用示例
  • 四、从新手角度逐步优化模拟实现`my_strcpy`函数
    • 1. 基础版本(简单的字符逐个复制)
    • 2. 改进版本(添加目标空间检查)
    • 3. 优化版本(利用指针运算)

一、my_strcpy函数功能

my_strcpy函数的主要功能是将一个字符串(包括结尾的'\0'字符)从源地址复制到目标地址。它用于在C语言中实现字符串的拷贝操作,是字符串处理中非常基础且常用的函数之一。

二、函数类型

my_strcpy函数通常具有以下原型:

char *my_strcpy(char *destination, const char *source);
  • destination:目标字符串的指针,用于存储复制后的字符串。该指针所指向的内存空间需要足够大,以容纳源字符串及其结尾的'\0'字符。
  • const char *source:源字符串的指针,源字符串在复制过程中不会被修改,因此使用const修饰,以确保函数不会意外修改源字符串的内容。

函数返回值为char *类型,即目标字符串的指针。这样可以方便地进行链式调用或在其他需要字符串指针的地方使用。

三、函数使用示例

以下是一个简单的使用my_strcpy函数的示例:

#include <stdio.h>

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

int main() {
    char dest[20];
    char src[] = "Hello, World!";
    my_strcpy(dest, src);
    printf("Copied string: %s\n", dest);
    return 0;
}

char *my_strcpy(char *destination, const char *source) {
    char *ptr = destination;
    while (*source!= '\0') {
        *destination = *source;
        destination++;
        source++;
    }
    *destination = '\0';
    return ptr;
}

在上述示例中,首先定义了一个目标字符数组dest和一个源字符串src。然后调用my_strcpy函数将src复制到dest中,并打印出复制后的字符串。

四、从新手角度逐步优化模拟实现my_strcpy函数

1. 基础版本(简单的字符逐个复制)

新手可能会首先想到通过逐个字符复制的方式来实现my_strcpy函数,如下所示:

char *my_strcpy_basic(char *destination, const char *source) {
    char *ptr = destination;
    while (*source!= '\0') {
        *destination = *source;
        destination++;
        source++;
    }
    *destination = '\0';
    return ptr;
}
  • 这个版本的思路很直接:使用一个循环,只要源字符串中的当前字符不是'\0',就将该字符复制到目标字符串中,然后同时移动源字符串和目标字符串的指针,直到遇到源字符串的结束标志'\0'。最后,在目标字符串的末尾添加'\0'字符,以确保复制后的字符串是完整的。
  • 但是,这个版本存在一些潜在的问题,例如没有对目标字符串的空间进行检查,如果目标字符串的空间不够大,可能会导致缓冲区溢出,引发程序错误甚至安全漏洞。

2. 改进版本(添加目标空间检查)

为了避免缓冲区溢出,我们可以添加对目标字符串空间的检查,如下所示:

char *my_strcpy_with_check(char *destination, const char *source) {
    char *ptr = destination;
    while (*source!= '\0' && destination < ptr + sizeof(destination)) {
        *destination = *source;
        destination++;
        source++;
    }
    if (destination < ptr + sizeof(destination)) {
        *destination = '\0';
    }
    return ptr;
}
  • 在这个改进版本中,我们在循环条件中添加了对目标字符串空间的检查。destination < ptr + sizeof(destination)用于确保目标字符串的指针没有超出其分配的空间。sizeof(destination)返回的是目标字符串指针所指向的数组的大小(以字节为单位),这里假设目标字符串是一个字符数组。
  • 如果在复制过程中没有超出目标字符串的空间,并且已经复制完源字符串,那么在循环结束后,还需要确保在目标字符串的末尾添加'\0'字符。

3. 优化版本(利用指针运算)

进一步优化可以利用指针的算术运算来简化代码,提高效率,如下所示:

char *my_strcpy_optimized(char *destination, const char *source) {
    char *ptr = destination;
    while ((*destination++ = *source++)!= '\0');
    return ptr;
}
  • 这个版本的代码更加简洁和高效。在while循环条件中,先将源字符串的当前字符赋值给目标字符串的当前位置,然后同时将两个指针都向后移动一位。循环会一直进行,直到赋值的字符为'\0',此时循环结束。
  • 这种方式利用了C语言中赋值表达式的返回值特性,即赋值表达式会返回被赋的值。同时,后置++运算符会先使用指针的值进行赋值操作,然后再将指针向后移动一位,从而实现了简洁而高效的字符串复制。

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

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

相关文章

FPGA实现UART对应的电路和单片机内部配合寄存器实现的电路到底有何区别?

一、UART相关介绍 UART是我们常用的全双工异步串行总线&#xff0c;常用TTL电平标准&#xff0c;由TXD和RXD两根收发数据线组成。 那么&#xff0c;利用硬件描述语言实现UART对应的电路和51单片机内部配合寄存器实现的电路到底有何区别呢&#xff1f;接下来我们对照看一下。 …

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…

【VScode】设置代理,通过代理连接服务器

文章目录 VScode编辑器设置代理1.图形化界面1.1 进入proxy设置界面1.2 配置代理服务器 2.配置文件&#xff08;推荐&#xff09;2.1 打开setting.json 文件2.2 配置代理 VScode编辑器设置代理 根据情况安装nmap 1.图形化界面 1.1 进入proxy设置界面 或者使用快捷键ctrl , 。…

【HarmonyOS】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置Resiza…

光伏仿真与设计系统应用架构深度剖析

在光伏产业蓬勃发展的时代背景下&#xff0c;绿虫光伏仿真与设计系统成为推动其高效发展的核心力量。其应用架构涵盖多个关键步骤&#xff0c;每个环节都紧密相扣&#xff0c;共同构建起精准且高效的设计体系。 气象分析作为开篇之笔&#xff0c;起着基石般的重要作用。系统全…

k8s dashboard离线部署步骤

确定k8s版本&#xff0c;以1.23为例。 部署metrics-server服务&#xff0c;最好用v0.5.2。 用v0.6.0&#xff0c;可能会报以下错误&#xff1a; nodekubemaster:~/Desktop/metric$ kubectl top nodes Error from server (ServiceUnavailable): the server is currently unabl…

05-Linux系统编程之进程(下)

一、子进程资源回收 1.概述 在每个进程退出的时候&#xff0c;内核释放该进程所有的资源&#xff0c;包括一些存储在栈区、全局区的数据、打开的文件、占用的内存等。但是仍有一部分信息没有释放&#xff0c;这些信息主要指进程控制块 PCB 的信息&#xff08;包括进程号、退出…

HDFS异构存储和存储策略

一、HDFS异构存储类型 1.1 冷、热、温、冻数据 通常&#xff0c;公司或者组织总是有相当多的历史数据占用昂贵的存储空间。典型的数据使用模式是新传入的数据被应用程序大量使用&#xff0c;从而该数据被标记为"热"数据。随着时间的推移&#xff0c;存储的数据每周…

【51单片机】02LED流水灯实验

点亮你的LED 一、点亮第一个LED1.GPIO介绍2.P1、P2、P3端口 二、LED实验2.尝试点亮LED3.LED流水灯 一、点亮第一个LED 1.GPIO介绍 这块内容这里可以做简单的了解&#xff0c;与数电知识强相关。后续可以再回过头来学习 GPIO (general purpose input output) 通用输入输出端口…

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…

云安全相关博客阅读(一)

2024-03-04 Cloudflare announces Firewall for AI 关注问题&#xff1a; 传统的WAF功能能够保护web和api安全&#xff0c;但是随着LLM等AI模型等出现&#xff0c;保护这些AI相关应用等安全是一个新出现的问题虽然AI应用是新的场景&#xff0c;但是以往的攻击方法也能够直接用…

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…

从零手写线性回归模型:PyTorch 实现深度学习入门教程

系列文章目录 01-PyTorch新手必看&#xff1a;张量是什么&#xff1f;5 分钟教你快速创建张量&#xff01; 02-张量运算真简单&#xff01;PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch&#xff1f;张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器&#xff1a;PyTor…

【python】matplotlib(radar chart)

文章目录 1、功能描述和原理介绍2、代码实现3、效果展示4、完整代码5、多个雷达图绘制在一张图上6、参考 1、功能描述和原理介绍 基于 matplotlib 实现雷达图的绘制 一、雷达图的基本概念 雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也被称为蛛网图或星型图&…

数据库环境安装(day1)

网址&#xff1a;MySQL 下载&#xff08;环境准备&#xff09;&#xff1a; &#xff08;2-5点击此处&#xff0c;然后选择合适的版本&#xff09; 1.linux在线YUM仓库 下载/安装: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…

Fabric链码部署测试

参考链接&#xff1a;运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) &#xff08;2&#xff09;fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…

数据结构与算法之二叉树: LeetCode 107. 二叉树的层序遍历 II (Ts版)

二叉树的层序遍历 II https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/ 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&a…

Python插件化开发实战:开发个图片浏览器

在本篇教程中&#xff0c;我将详细介绍如何使用Python开发一个基于插件架构的图片浏览器。这个项目将展示如何实现插件系统、如何处理图片显示,以及如何使用wxPython构建GUI界面。 “C:\pythoncode\pythonplugin\your_project\main_app.py” 项目概述 我们将开发一个具有以下…

根据python代码自动生成类图的实现方法[附带python源码]

概述 利用python库抽象语法树(AST)和类图描述语言(PlantUML),实现自动将python代码生成类图的目的。 环境 windowsvscodepythonplantuml ✒️网上好像大部分都是用Pyreverse库来实现的&#xff0c;但是我实际测试发现只能在一个文件中才能行&#xff0c;当然应该有解决方法…

下载b站高清视频

需要使用的edge上的一个扩展插件&#xff0c;所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站&#xff0c;登录自己账号&#xff08;登录后才能下载到高清&#xff01;&#xff01;&#xff09;。打开一个视频&#xff0c;选择自…