C语言-字符串函数的实现(二)之strcpy

C语言中的字符串函数有如下这些

  • 获取字符串长度
  • strlen
  • 长度不受限制的字符串函数
  • strcpy
  • strcat
  • strcmp
  • 长度受限制的字符串函数
  • strncpy
  • strncat
  • strncmp
  • 字符串查找
  • strstr
  • strtok
  • 错误信息报告
  • strerror

接下来看看如何实现它们

长度不受限制的字符串函数

我们看看文档是怎样说的,如下

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

Copy string
字符串拷贝(字符串复制)
Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).

复制由 字符指针source指向的 C字符串到另一个字符数组中,该 字符数组字符指针destination指向
To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

为避免溢出,由destination指向的字符数组的大小需要足够长,足够包含住源字符串(包含’\0’)

综上,可以知道

int main()
{
    char arr1[] = "abcdefghi";
    char arr2[] = "bit";
    // 把arr2的内容拷贝到arr1中
    //strcpy(arr1, arr2);
    // 怎么拷贝?

    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

断言指针不为空是个好习惯~

//char* my_strcpy(char* dest, char* src)
// src加上const,为什么?因为我们只需要拷贝,不需要改动源字符串,防止发生修改,所以加上const修饰
char* my_strcpy(char* dest, const char* src)
{
    assert(dest != NULL);
    assert(src != NULL);

    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = *src;   // '\0'
    // 返回目的空间的起始地址
    return dest;
}

源字符串拷贝到目的空间,寻找’\0’,不是’\0’的就执行 *dest = *src,把源字符赋值给目的空间,然后两个指针都往后偏移,也就是都进行++,当 *src为'\0'时,说明源字符串已经到结尾了,就退出这个循环,直接将 '\0'赋值给*dest,最后返回 dest

可以进行优化,如下

char* my_strcpy(char* dest, const char* src)
{
    assert(dest != NULL);
    assert(src != NULL);
    // 优化
    while (*src != '\0')
    {
        *dest++ = *src++;
    }
    *dest = *src;   // '\0'
    // 返回目的空间的起始地址
    return dest;
}

当然还可以继续优化,变得更加简洁,直接将 *dest++ = *src++作为判断条件,同时还会执行操作,如下

char* my_strcpy(char* dest, const char* src)
{
    assert(dest != NULL);
    assert(src != NULL);
    // 优化
    // 拷贝src指向的字符串到dest指向的空间,包含'\0'
    char* rest = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    // 返回目的空间的起始地址
    return rest;
}

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客有帮到你

你轻轻一个赞,就是我世界里的一颗星

还有因本人水平有限,如有错误以及不足之处,欢迎 靓仔靓女们指出。

Original: https://www.cnblogs.com/god23bin/p/14669215.html
Author: god23bin
Title: C语言-字符串函数的实现(二)之strcpy

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594652/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 财务自由之路上的第一步:思想

    各位读者,今天吃汤圆或者饺子了吗?冬至快乐!!! 冬至新开系列 —— 财务自由之路 此为第一篇,你的思想决定你的穷富 理财 理财的定义:所有和钱有关的安排都是理财,例如:消费计划,…

    Java 2023年6月9日
    076
  • 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    Spring Security功能多,组件抽象程度高,配置方式多样,导致了Spring Security强大且复杂的特性。Spring Security的学习成本几乎是Spring…

    Java 2023年5月30日
    0115
  • Mac_配置jdk环境变量

    进入命令行 cd ~ touch .bash_profile vi .bash_profile 输入内容jdk变量配置内容: JAVA_HOME=/Library/Java/Jav…

    Java 2023年5月30日
    079
  • Spring 中经典的 9 种设计模式,打死也要记住啊!

    来源:blog.csdn.net/caoxiaohong1005 转载: https://mp.weixin.qq.com/s/HdOKIp_rFgX-h65M0pRK9Q 1.简…

    Java 2023年5月30日
    074
  • Spring Bean的作用域

    Spring Bean的作用域或者说范围主要有五种: 作用 描述 singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的…

    Java 2023年6月14日
    081
  • 一冲计划

    计划总会过期,实现了的才会永久保存 Well Plan 顺利通过我的第一学期的所有科目,可以熟练的操作计算机一级,并将计算机二级提上日程,不打算考一级计算机,想要直接考二级!趁着假…

    Java 2023年6月5日
    079
  • k8s-Pod基础

    制作镜像 第一个pod 搭建Harbor仓库 重启策略 启动命令 pod基本命令 设置环境变量 数据持久化和共享-hostPath 数据持久化和共享-emptyDir JSON格式…

    Java 2023年6月8日
    079
  • C#中的线程之Abort陷阱

    1.简介 C#中通常使用线程类Thread来进行线程的创建与调度,博主在本文中将分享多年C#开发中遇到的Thread使用陷阱。 Thread调度其实官方文档已经说明很详细了。本文只…

    Java 2023年5月29日
    085
  • 解决Nginx同网段ip_hash负载均衡无效果

    问题 Nginx ip_hash在局域网中所有机器访问的都是同一台机器没有Hash。造成原因如被Hash的Ip为192.168.1.100;实则上Nginx进行Hash算法时取的是…

    Java 2023年6月5日
    082
  • 第三周

    第三周 1.测试成功的接口再次测试报错 原因:之前在查询时更改了方法,由Mybatis Plus 查询的方式改为了xml,同时在实体类中添加了字段做连表查询,导致之前所有用Myba…

    Java 2023年6月7日
    093
  • 深入浅出SpringSecurity

    SpringSecurity学习 SpringSecurity简介 安全框架的概述 什么是安全框架?是为了解决安全问题的框架。如果没有安全框架,我们需要手动处理每个资源的访问控制,…

    Java 2023年6月5日
    0117
  • 20.多线程-基本代码

    示例一: 示例二: 主线程加入while循环,一直执行不退出。子线程会执行完毕,不会发生:子线程未执行完,主线程退出了,子线程被迫结束。 示例三: 子线程执行完了之后,主线程才会执…

    Java 2023年5月29日
    084
  • java http/https post/get 请求 ,携带header参数

    java;gutter:true; import com.alibaba.fastjson.JSONObject;</p> <p>import org.ap…

    Java 2023年5月29日
    076
  • Halo 开源项目学习(三):注册与登录

    基本介绍 首次启动 Halo 项目时需要安装博客并注册用户信息,当博客安装完成后用户就可以根据注册的信息登录到管理员界面,下面我们分析一下整个过程中代码是如何执行的。 博客安装 项…

    Java 2023年6月9日
    062
  • Java maven构建命令使用总结

    实践环境 Apache Maven 3.0.5 (Red Hat 3.0.5-17) maven构建生命周期 学习Maven构建命令之前,我们不烦先简单了解下Maven构建生命周期…

    Java 2023年6月16日
    074
  • Java全栈系列笔记

    Java全栈系列笔记 全部文档、项目、源码: github:https://github.com/name365/Blog-Java 码云:https://gitee.com/ya…

    Java 2023年5月29日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球