C语言常见笔试题——strcpy函数的实现

2023-11-01

转载地址:http://blog.csdn.net/gpengtao/article/details/7464061/

大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:

[cpp]  view plain copy
  1. char *my_strcpy(char *dst,const char *src)  
  2. {  
  3.     assert(dst != NULL);  
  4.     assert(src != NULL);  
  5.     char *ret = dst;  
  6.     while((* dst++ = * src++) != '\0')   
  7.         ;  
  8.     return ret;  
  9. }  
如果注意到:

1,检查指针有效性;

2,返回目的指针des;

3,源字符串的末尾 '\0' 需要拷贝。

写出上面实现函数就不在话下。

然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:

[cpp]  view plain copy
  1. char str[10]="abc";  
  2. my_strcpy(str+1,str);  

然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。

strcpy的正确实现应为:

[cpp]  view plain copy
  1. char *my_strcpy(char *dst,const char *src)  
  2. {  
  3.     assert(dst != NULL);  
  4.     assert(src != NULL);  
  5.     char *ret = dst;  
  6.     memcpy(dst,src,strlen(src)+1);  
  7.     return ret;  
  8. }  
memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是如何训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:

[cpp]  view plain copy
  1. void * my_memcpy(void *dst,const void *src,unsigned int count)  
  2. {  
  3.      assert(dst);  
  4.      assert(src);  
  5.      void * ret = dst;  
  6.      if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝  
  7.      {  
  8.          while(count--)  
  9.          {  
  10.              *(char *)dst = *(char *)src;  
  11.              dst = (char *)dst + 1;  
  12.              src = (char *)src + 1;  
  13.          }  
  14.      }  
  15.      else                       //源地址和目的地址重叠,高字节向低字节拷贝  
  16.      {   
  17.          dst = (char *)dst + count - 1;  
  18.          src = (char *)src + count - 1;   
  19.          while(count--)   
  20.          {  
  21.              *(char *)dst = *(char *)src;  
  22.              dst = (char *)dst - 1;  
  23.              src = (char *)src - 1;  
  24.          }  
  25.     }  
  26.     return ret;  
  27. }  

  1. strcmp的实现代码  
  2. http://blog.chinaunix.net/uid-20480343-id-1941622.html  
  3. int my_strcmp(const char *source,const char *dest)  
  4. {  
  5.     int ret = 0 ;  
  6.     //这里的*dest判断很重要,否则二者完全相等的时候就会越界出现难以判断的情况  
  7.     while( ! (ret = *( unsigned char *)source - *(unsigned char *)dest) && *dest)   
  8.         source++, dest++;  
  9.     if ( ret < 0 )  
  10.         ret = -1 ;  
  11.     else if ( ret > 0 )  
  12.         ret = 1 ;  
  13.     return(ret);  
  14. }  

两者结合才是strcpy函数的真正实现吧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言常见笔试题——strcpy函数的实现 的相关文章

  • MySQL主从同步原理

    主从复制 是用来建立一个和主数据库完全一样的数据库环境 称为从数据库 主数据库一般是准实时的业务数据库 原理 数据库有个bin log二进制文件 记录了所有sql语句 我们的目标就是把主数据库的bin log文件的sql语句复制过来 让其在
  • ZOJ1610 线段树区间计数

    这题和之前的某道区间建立正好相反 给整懵了 题意 给定一个长为 8000 8000 8000的区间 每次染色一定长度的区间 最后问你每种颜色的区间有多少段 题解 注意必须建 8000 8000 8000的树 然后模拟下递归过程 蒟蒻只会这么
  • L2-034 口罩发放 (25 分)

    好恶心的一道题 就因为我把有症状的人用set存 结果一直卡在后三个样例 把我恶心吐了 最后实在没法把set改成vector顺便标记一下看看是否访问过一次 然后就过了 我tm改了接近两个小时 结果就卡在这 include
  • sed删除中文字符

    LANG C sed r s x81 xFE x40 xFE g test txt 转载于 https blog 51cto com dellinger 2409040
  • 宽带连接已断开

    宽带连接已断开 故障描述 原因分析 解决方案 1 排查线路接触不良 2 排查WI FI开关冲突 3 排查关闭节能以太网功能冲突 3 排除其他网卡冲突 4 排查ipv6协议 和 Ipv4协议冲突 方案一 取消勾选ipv6协议 方案二 重装或者
  • k8s学习-CKS真题-Dockerfile和deployment优化

    目录 题目 环境搭建 解题 Dockerfile deployment yaml 模拟题 参考 题目 Task 1 分析和编辑给定的 Dockerfile cks docker Dockerfile 基于 ubuntu 16 04 镜像 并
  • [转载] 深入理解log机制

    原文 http feihu me blog 2014 insight into log 诊断日志对于定位和修复问题起着至关重要的作用 曾经很傻很天真的认为输出日志就是仅仅调用printf 或者std cerr 而已 简单的不能在简单了 这种
  • “区块链+影视”将会在影视娱乐界刮起怎样的风?

    当一种技术能够渗透到各个产业 并在各个产业都产生巨大的价值的时候 它的潜力和未来价值就会被更多人所追捧 在过去的一年时间里 区块链这一划时代的技术夺目地进入公众视野 被认为是当前最有可能带来颠覆性改变的技术 进入2018年来 区块链行业已更
  • kettle 教程(一):简介及入门

    介绍 kettle 是纯 java 开发 开源的 ETL工具 用于数据库间的数据迁移 可以在 Linux windows unix 中运行 有图形界面 也有命令脚本还可以二次开发 kettle 的官网是 https community hi
  • HCIA笔记整理

    网络基础 什么是网络 网络就是由网络连接设备通过传输介质将网络终端设备连接起来 进行资源共享 信息传递的平台 交换机 交换机是按照通信两端传输信息的需要 用人工或设备自动完成的方法把要传输的信息送到符合要求的相应路由上的技术统称 交换机的作
  • element 表单动态获取性别

    element 动态获取性别 在前端页面里总是会有根据1和2显示相应的内容 我是小白刚接触这些就感觉无能为力 找了一些资料才有了解决方法 话不多说上代码
  • Postgresql时间处理技巧,每半天,每周,每月和每5分钟统计

    一 每半天 如果有张表log bus runinfo里有一个created date是timestamp类型 如何统计12点前的数据 在 PostgreSQL 中 您可以使用 DATE TRUNC 函数和 WHERE 子句来统计特定时间范围
  • opsForList().rightPushAll 是覆盖,还是添加

    opsForList rightPushAll 是添加 这个方法将给定的所有值添加到列表的最右端 它并不会覆盖列表中已有的任何值
  • while(++i)与 while(i++)

    1 while i 是先执行i 1 再进行判断 再执行循环体 2 while i 是先判断 再执行循环体 再 1 循环结束后 while i 执行完后 i 0 while i 执行完后 i 1 测试代码1 include
  • 正大国际琪貨:做股指期货需要多少保证金?

    股指之前是大户才有机会做 因为需要的条件太高了 一般人玩不来 为什么 看看国内的股指条件 股指的保证金比例是12 14 一手股指保证金大约18万元 啥 这是什么概念 怎么这么贵 哈哈 是不是已经把很多人吓跑了 但这东西 波动的一个点值也很大
  • LSTM简单例子(MATLAB code)

    最近在学习RNN和LSTM 1 http magicly me 2017 03 09 iamtrask anyone can code lstm 2 https zybuluo com hanbingtao note 581764 3 ht
  • GLTF中的Draco编译与测试

    1 GLTF Primitive primitive里面有什么属性 Draco压缩是跟GLTF Primitive primitive息息相关的 下面是 GLTF Primitive 中常见的属性 1 GLTF Accessor indic
  • 12C++11多线程编程之原子操作std::atomic

    1 原子操作std atomic相关概念 前言 原子操作 更小的代码片段 并且该片段必定是连续执行的 不可分割 1 1 原子操作std atomic与互斥量的区别 1 互斥量 类模板 保护一段共享代码段 可以是一段代码 也可以是一个变量 2
  • Docker镜像打包及解压(内外网)

    背景 在企业中往往出现了内网不能和外网相通 不能使用docker pull命令来拉取镜像 这个时候我们就可以考虑在有所需镜像的服务器上导出镜像 再将其上传到内网服务器上 有两种方法 一种是通过容器 一种是通过镜像 其实本质是一样的 容器的实
  • Tomcat配置出错:Using CATALINA_OPTS: ““&&Tomcat启动闪退问题解决

    文章目录 前言 一 问题描述 二 定位问题 1 CMD命令启动 2 解决方法 前言 本篇问题所处环境 Tomcat 9 Java11 Win 10 一 问题描述 在安装配置Tomcat过程中 通过startup bat脚本命令启动Tomca

随机推荐

  • javascript 清除字符串空格

    去除字符串前后的空格 function trim str return str replace s s g 去除字符串中所有空格 function removeAllSpace str return str replace s g 用法举例
  • 服务器散列值与文件,服务器计算的散列值和客户端安全

    服务器计算的散列值和客户端安全 内容精选 换一换 执行adc命令 系统内部通过ADC与运行环境上的ADA的交互 实现文件传输 设置日志级别 心跳检测等功能 在ADC与ADA交互时 涉及使用密钥证书实现ADA 作为服务端 和ADC 作为客户端
  • Mysql 显示替换 if or

    摘要 使用Mysql的进行sql查询过程中 经常会遇到对查询结果做一些显示的替换 方式一 select if value in 0 1 2 NO YES from table name 方式二 select if value 0 or va
  • spring事务的7种传播行为——详细介绍

    目录 事务传播行为 1 PROPAGATION REQUIRED 2 PROPAGATION SUPPORTS 3 PROPAGATION MANDATORY 4 PROPAGATION MANDATORY 5 PROPAGATION NO
  • js开发技巧-实用型

    目录 1 按位或 2 按位与 3 按位取反 4 按位异或 5 6 toString 7 gt 和 lt 8 Number EPSILON
  • 【SpringBoot学习】SpringBoot的自动配置

    SpringBoot自动配置 SpringBootApplication是一个复合注解 其中主要包含以下注解 SpringBootConfiguration 基本是属于替代品 Configuration EnableAutoConfigur
  • ROS 執行launch報錯 python2.7錯誤

    mjm mjm pc Desktop ros robot pro roslaunch ros urdf PK test launch Traceback most recent call last File opt ros melodic
  • Java输出PPT文件(二) - 占位符数据替换

    Java输出PPT文件 二 占位符数据替换 文章目录 Java输出PPT文件 二 占位符数据替换 0 前言 1 依赖 2 代码 3 测试 3 1 模板准备 3 2 替换结果 4 一点分析 4 1 parseParagraph 4 2 get
  • linux下svn命令大全

    1 将文件checkout到本地目录 svn checkout path path是服务器上的目录 例如 svn checkout svn 192 168 1 1 pro domain 简写 svn co 2 往版本库中添加新的文件 svn
  • 淤地坝安全自动监测预警系统解决方案

    一 方案背景 淤地坝是在水土流失地区各级沟道中 以拦泥淤地为目的而修建的坝工建筑物 其主要作用为 滞洪 拦泥 淤地 蓄水 减轻黄河泥沙 保持水土不流失 建设农田 发展农业生产等 我国黄土高原地区现有淤地坝58776座 存在量多面广 建设标准
  • PowerShell脚本文件无法加载运行

    显示Restricted 不允许执行任何脚本 Get ExecutionPolicy RemoteSigned 可执行任何脚本 需要管理员权限 才能设置成功 Set ExecutionPolicy RemoteSigned
  • Centos 7 配置IP地址时network 和networkmanager冲突

    一 区别 1 network service的制御网络接口配置信息改动后 网络服务必须从新启动 来激活网络新配置的使得配置生效 这部分操作和从新启动系统时时一样的作用 制御 控制 是 etc init d network这个文件 可以用这个
  • 2.4.1 用NPOI操作EXCEL--画线

    之所有说NPOI强大 是因为常用的Excel操作她都可以通过编程的方式完成 这节开始 我们开始学习NPOI的画图功能 先从最简单的开始 画一条直线 对应的代码为 HSSFSheet sheet1 hssfworkbook CreateShe
  • android中完全退出当前应用程序的四种方法

    Android程序有很多Activity 比如说主窗口A 调用了子窗口B 如果在B中直接finish 接下里显示的是A 在B中如何关闭整个Android应用程序呢 本人总结了几种比较简单的实现方法 1 Dalvik VM的本地方法 andr
  • toFixed精度丢失问题

    bug说明 10 3950 3935 00 用toFixed 2 得到的是40904 32 实际应该是40904 33 解决的方法 第一种 在main js中直接复制下面代码即可 Number prototype toFixed funct
  • 【9秒原创】cocos2d-x横版rts手游《口袋仙侠》alpha1.0正式开源

    9秒原创 Firefly cocos2d x的横版rts手机网游 口袋仙侠 alpha V1 0 商用版本 完整源码下载 特别声明 1 口袋仙侠 项目基于MIT协议 9秒社团团队允许任何厂商及个人对其进行修改和商用 并将会在本板块内进行技术
  • Linux NetworkManager网络服务详解

    一 网络配置文件 Linux 为 配 置 网 络 提 供 了 许 多 工 具 其 中 有 图 形 界 面 的 如 NetworkManager 也有伪图形界面 如 system config network 的 虽然使用这些工具来配置网络会
  • iSH使用与优化全网整合教程【持续更新】【精华】

    最后一次更新 2023 4 22 请勿利用文章内的相关技术从事非法测试 由于传播 利用此文所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本人负责 作者不为此承担任何责任 iSH介绍与换源 已安装并已完成换源的用户可直接跳过 介
  • Deep Java Library(六)DJLServing自定义模型,自定义Translator注意事项

    DJLServing自定义模型中自定义Translator注意事项需要仔细读一下DJLServing源码中的ServingTranslatorFactory类 一开始不了解以为DJLServing选择Translator像玄学 后来看了像迷
  • C语言常见笔试题——strcpy函数的实现

    转载地址 http blog csdn net gpengtao article details 7464061 大家一般认为名不见经传strcpy函数实现不是很难 流行的strcpy函数写法是 cpp view plain copy ch