strcpy是常用的字符串复制函数,经常在面试中考到。该文件位于glibc源码的string目录中。

在线资源路径:

http://www.oschina.net/code/explore/glibc-2.9/string/strcpy.c

快速查看源码如下:

 1 /* Copyright (C) 1991, 1997, 2000, 2003 Free Software Foundation, Inc.
 2    This file is part of the GNU C Library.
 3
 4    The GNU C Library is free software; you can redistribute it and/or
 5    modify it under the terms of the GNU Lesser General Public
 6    License as published by the Free Software Foundation; either
 7    version 2.1 of the License, or (at your option) any later version.
 8
 9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
17
18 #include <stddef.h>  /* 用到了ptrdiff_t */
19 #include <string.h>
20 #include <memcopy.h>
21 #include <bp-checks.h>  /* 定义了CHECK_BOUNDS_LOW和CHECK_BOUNDS_HIGH */
22
23 #undef strcpy
24
25 /* Copy SRC to DEST.  */
26 char *
27 strcpy (dest, src)
28      char *dest;
29      const char *src;
30 {
31   char c;
32   char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
33   const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
34   size_t n;
35
36   do
37     {
38       c = *s++;
39       s[off] = c;  /* 注意这种写法, s[off]相当于 *(s+off) */
40     }
41   while (c != '\0');
42
43   n = s - src;
44   (void) CHECK_BOUNDS_HIGH (src + n);
45   (void) CHECK_BOUNDS_HIGH (dest + n);
46
47   return dest;
48 }
49 libc_hidden_builtin_def (strcpy)

以上的算法主要通过计算好两个字符串的偏移量,然后循环遍历src字符串,逐个赋值给dest的相应位置;gnu的源码一般都比较复杂,进行了相应的范围检查等处理;

再来看个简单的,比较独立的代码:

 1 char * strcpy(char * dest, const char * src)
 2 {
 3     if ( dest == NULL || src == NULL) // 地址检查
 4     {
 5         return NULL;
 6     }
 7
 8     if ( dest == src) // 相同地址检查
 9     {
10         return dest;
11     }
12
13     char * str = dest;
14     while ( ( *str++ = *src++ ) != '\0' )  // 循环复制
15     {
16         ;
17     }
18
19     return dest;
20 }

注意,以上代码采用了清爽的缩进格式,保证代码的清晰和可读性; 第8行的检查比较容易漏掉,这个是重点;

转载于:https://www.cnblogs.com/QuLory/archive/2012/09/17/glibc-strcpy.html

【glibc源码分析】--strcpy.c 字符串复制相关推荐

  1. Linux内核源码分析—从用户空间复制数据到内核空间

    Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...

  2. MySQL · 源码分析 · MySQL 半同步复制数据一致性分析

    简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_mas ...

  3. glibc源码分析之utime系列函数

    glibc中关于utime的函数有utime,utimes.它们都是系统调用的封装函数. utime函数由脚本生成.生成的.S文件的内容为: #define SYSCALL_NAME utime #d ...

  4. 三星uboot1.1.6源码分析——start.s(4)——从NAND复制源码到RAM(3)

    通过上两篇博客终于把从NAND复制源码到RAM的c语言写的部分说完了,现在回到start.s中,接着分析余下的代码. ----------------------------------------- ...

  5. php cut截取字符串,php源码分析之DZX1.5字符串截断函数cutstr用法

    本文实例讲述了php源码分析之DZX1.5字符串截断函数cutstr用法.分享给大家供大家参考.具体分析如下: /** * 函数来源DZX1.5,文件所在 /source/function/funct ...

  6. AFL二三事——源码分析

    AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...

  7. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  8. 高性能网络I/O框架-netmap源码分析

    前几天听一个朋友提到这个netmap,看了它的介绍和设计,确实是个好东西.其设计思想与业界不谋而合--因为为了提高性能,几个性能瓶颈放在那里,解决方法自然也是类似的. netmap的出现,它既实现了一 ...

  9. 网站压测工具 Webbench 源码分析

    介绍 Webbench是一个在Linux下使用的非常简单的网站压测工具.它的源代码只有500多行,挺值得一看的开源项目. 实现原理 只是简单的fork()出多个子进程模拟客户端去访问设定的URL,测试 ...

最新文章

  1. eclipse创建python项目提示Project interpreter not specified
  2. 如何通过redisTemplate获得key的过期时间
  3. 好程序员Web前端分享程序的三大结构(二)while循环
  4. JavaScript 省市级联效果
  5. 如何分析线程转储– IBM VM
  6. rlwrap解决sqlplus上下键和backspace键找历史命令
  7. ssm实现管理员和用户_基于SSM的网上水果生鲜超市商城管理系统
  8. 面试题1:赋值运算符函数
  9. 第一次点击button, view视图出现;第二次点击button,view视图消失
  10. python进阶(一)
  11. mysql 镜像安装方法_MySql镜像安装
  12. 分享一个关于跨境电商的竞品分析报告
  13. oracle 英文 简历,英文优秀个人简历模板范文
  14. react富文本编辑器
  15. 达梦数据库的服务启动
  16. 互联网毒瘤——内容农场
  17. linux下wifi连接方法
  18. 科大讯飞语音听写app闪退
  19. 武汉大学计算机学院 教师名录,韩镇副教授-教师名录-国家多媒体软件工程技术研究中心...
  20. chartjs 动态数据_使用ChartJS构建动态仪表板

热门文章

  1. python怎么读取图像的txt标注_使用包含文件名的.txt文件读取图像数据
  2. 计算机网络课程设计之网络嗅探器的设计与实现
  3. spring boot jwt_springboot整合JWT
  4. 基于matlab数字识别算法系统设计与实现(含源文件)
  5. PHP笔记-使用PHPStorm断点调试php代码
  6. 前端笔记-vue中引入Bootstrap
  7. Spring Boot文档阅读笔记-@SpringBootApplication官方解析与实例(1.5.19)
  8. axios post body参数_vue之axios封装
  9. linux单点登录命令,配置RHEV中LINUX 虚拟机使用ACTIVE DIRECTORY(AD域)实现单点登录的方法...
  10. vue引用electron_如何搞定跨平台桌面开发?Electron助你快速起步