一、题目: 
    已知strcpy函数的原型是: 
        char * strcpy(char * strDest,const char * strSrc); 
    1.不调用库函数,实现strcpy函数。 
    2.解释为什么要返回char *。

二、标准答案:

char *strcpy(char *strDest, const char *strSrc)

{

    assert((strDest!=NULL) && (strSrc !=NULL));    // 2分

    char *address = strDest;                                          // 2分

    while( (*strDest++ = * strSrc++) != '\0' )         // 2分

              NULL ;

    return address ;                                                  // 2分

}

三、个人解析:

1、出现字符重叠。 例如:strcpy(str+1, str)

2、返回值char* 是实现链式表达式。 链式表达式(方便用strlen计算字符串的长度)

四、个人改进:

注:strlen 计算字符串以\0或者0结束

char *strcpy(char *strDest, const char *strSrc)

{  if (des == NULL || src== NULL)
        return NULL;

char* tmp = des;
    int len = strlen(src);
    memcpy(des, src, len);
    return tmp;

}

六、扩展深入了解字符串创建:

char c1[3] = "abc";
    char c2[9] = "12345678";
    char* c4 = c2;
    char* c6 = new char[6];
    for (int i=0; i<5; i++)
    {
        c6[i] = i+1;
    }
    c6[5] = '\0';

delete c1;  报错,因为"abc" 存储在栈上自动释放。

delete c2;  报错,因为"12345678" 存储在栈上自动释放。

delete c4;报错,虽然c4在堆上new了一块内存,但是我们把他的指向修改到栈上"12345678" 的内存,所以报错,

但是c4开始new的内存出现内存泄露。

delete c6;正确,因为new是在堆上

五、举一个内存重叠例子:

#include<stdio.h>
 
void Copy(int *a, int  *b,int len)//b从开始复制len个数字到a
{
    int i ;                      //为了更突出问题,这里不进行参数检查
    for (i = 0; i < len; i++)
    {
        a[i] = b[i];
    }
}
 
int main()
{
    int i;
    int  arr[10] = {1,2,3,4,5,6,7,8,9,10};
    Copy(&arr[3], &arr[0], 7);       //1,2,3,1,2,3,4,5,6,7
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

C/C++ strcpy函数详解相关推荐

  1. strcpy()函数详解

    strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下: · 函数声明以及实现代码 char *strcpy(char *dst, const char *src); char ...

  2. 【C库函数】strncpy函数详解

    目录 strncpy 函数原型 参数讲解 返回值讲解 函数讲解 (1)一般使用场景 (2)特殊使用场景(错误) strncpy         拷贝n个字符到目标字符串中 函数原型 char *str ...

  3. 字符串拷贝函数:strcpy的详解及模拟实现

    字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...

  4. C语言strcpy、strcnpy函数详解

    C语言strcpy.strcnpy函数详解 一.strcpy函数 1.函数原型 2.参数.返回值解析 3.注意事项 4.strcpy函数模拟实现 二.strncpy函数 1.函数原型 2.与strcp ...

  5. 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)

     系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...

  6. Memset 函数详解

    Memset函数详解 需要的头文件 在C中<string.h> 在C++中<cstring> 函数介绍 memset 原型:extern void *memset(void * ...

  7. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  8. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  9. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

最新文章

  1. 一个利用Dataflow实现的Actor
  2. 忽略某些文件 —— Git 学习笔记 05
  3. c++实现读写共享锁
  4. java简单文本编译器_java -简易文本编辑器
  5. 如何从基础到深入了解java构造器
  6. 关于C#语言中的集合
  7. 利用子查询解决复杂sql问题
  8. python开发app1001无标题_Python代写:CSSE1001 Dots Co帮做Python编程作业
  9. 车控APP发现安全隐患,研究人员模拟黑客入侵
  10. PIR控制器调节器并网逆变器电流谐波抑制策略
  11. 网上提交材料时让登记照瞬间符合审核尺寸要求的小工具
  12. 虹科工业树莓派在激光雕刻中的应用
  13. 详解 Redis 中布隆过滤器解决缓存穿透问题
  14. 程序员会不会英语的差别
  15. Mysql中LENGTH()函数
  16. bzoj1236 KPSUM bzoj2900 好玩的数字游戏
  17. 58同成前端面试分析
  18. 博客中可用的Emoji表情符号集,拿走不谢❤️❣️
  19. node-sassnpm ERR! command failed
  20. 计算机辅助制造工程师什么,cam工程师是什么意思

热门文章

  1. pg数据类型及数据类型转换
  2. 更换手机号需要考虑的解绑对象
  3. Excel如何标出两列重复值
  4. pathon爬虫基础
  5. 计算机科学与技术专业师范类,计算机科学与技术专业(师范)简介.PDF
  6. Spring Boot+Spring Security+JWT 实现token验证
  7. mybatis 没有引号_mybatis的单引号
  8. element-ui加载本地图片失败
  9. 立创开源|基于国产雅特力制作的多层全键自定义小键盘
  10. 解决 Vue 中的Element-ui 组件el-checkbox动态赋值点击没反应问题