实现自己的字符串拷贝函数Strcpy
2016-05-13 08:39
253 查看
strcpy是C语言的库函数,用于完成字符串的拷贝,很多笔试面试过程中要求我们自己实现这个函数。
字符串拷贝本身并没有太多技巧,可以利用最后的'\0'作为界限,用循环完成拷贝,代码如下
但如果只出这样的函数恐怕是不能得到工作的,因为这种复制函数有一个“坑”,这在函数说明中也提到了,那就是如果字符串内存有重叠复制就可能会失败(前往后复制会失败),而且可能不会出现任何异常!这种情况是程序设计过程中最恐怖的问题。所以便有了下面的改进版本
解决方法也很直接,就是用一个临时字符串作为中间容器,以免发生错误的覆盖情况。
其实内存复制函数memcpy()和memmove()的区别就是memcpy()没有考虑到内存重叠,而memmove()考虑到了。所以我们可以把我们的函数分别命名为Strcpy()和Strmove()。
字符串拷贝本身并没有太多技巧,可以利用最后的'\0'作为界限,用循环完成拷贝,代码如下
<pre name="code" class="cpp"><span style="font-size:18px;">char *Strcpy(char *strDst, const char *strSrc) { //功能:实现字符串的拷贝 //说明:要求两字符串内存区域 不可以 有重叠 // 负责添加'\0' // 发生错误返回NULL //指针判空 if(strDst==NULL || strSrc==NULL){ return NULL; } //循环复制 while((*strDst++ = *strSrc++) != '\0'); return strDst; }</span>
但如果只出这样的函数恐怕是不能得到工作的,因为这种复制函数有一个“坑”,这在函数说明中也提到了,那就是如果字符串内存有重叠复制就可能会失败(前往后复制会失败),而且可能不会出现任何异常!这种情况是程序设计过程中最恐怖的问题。所以便有了下面的改进版本
<pre name="code" class="cpp"><span style="font-size:18px;">char *Strcpy(char *strDst, const char *strSrc) { //功能:实现字符串的拷贝 //说明:两字符串内存区域 可以 有重叠 // 负责添加'\0' // 发生错误返回NULL // 指针判空 if(strDst==NULL || strSrc==NULL){ return NULL; } //复制到临时字符串 int len = strlen(strSrc)+1; char *strTmp = new char[len]; if(strTmp == NULL){ return NULL; } char *pTmp = strTmp;//保存首地址 while((*strTmp++ = *strSrc++) != '\0'); //复制到目标字符串 strTmp = pTmp;//恢复起点 while((*strDst++ = *strTmp++) != '\0'); delete[] pTmp; return strDst; }</span>
解决方法也很直接,就是用一个临时字符串作为中间容器,以免发生错误的覆盖情况。
其实内存复制函数memcpy()和memmove()的区别就是memcpy()没有考虑到内存重叠,而memmove()考虑到了。所以我们可以把我们的函数分别命名为Strcpy()和Strmove()。
相关文章推荐
- PHP获取URL
- 经典算法<二>约瑟夫问题 C++实现
- 二叉树遍历,先序中序二叉树构造,BFS,完全二叉树构造
- 解决Fedora解压文件产生乱码的问题
- android 之讯飞语音接入的输出(2)
- 获取SQLSERVER的IP地址
- APP界面设计之页面布局的22条基本原则
- 从《奋斗》到《欢乐颂》:十年之间,时代精神已变
- 经典算法<一>迷宫问题 2.单条路径 BFS求解 C++实现
- 经典算法<一>迷宫问题 1.单条路径 DFS求解 C++实现
- Mybatis报错
- 单调递增最长子序列
- java虚拟机底层结构详解
- 在线编程--层次打印二叉树
- Java关键字
- 单调递增最长子序列
- 今天是星期五,上班已经三个礼拜了
- myeclipse更换主题
- Next Permutation
- Forrest 2015年第三季度内存网格分析报告