strcpy函数的实现
2014-04-04 11:21
239 查看
大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:
1,检查指针有效性;
2,返回目的指针des;
3,源字符串的末尾 '\0' 需要拷贝。
写出上面实现函数就不在话下。
然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:
然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。
strcpy的正确实现应为:
memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是如何训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:
char *my_strcpy(char *dst,const char *src) { assert(dst != NULL); assert(src != NULL); char *ret = dst; while((* dst++ = * src++) != '\0') ; return ret; }如果注意到:
1,检查指针有效性;
2,返回目的指针des;
3,源字符串的末尾 '\0' 需要拷贝。
写出上面实现函数就不在话下。
然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:
char str[10]="abc"; my_strcpy(str+1,str);
然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。
strcpy的正确实现应为:
char *my_strcpy(char *dst,const char *src) { assert(dst != NULL); assert(src != NULL); char *ret = dst; memcpy(dst,src,strlen(src)+1); return ret; }
memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是如何训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:
void *memcpy(void* dst,const void* src,unsigned int count) { assert(src!=NULL); assert(dst!=NULL); void *ret=dst; char *pdst=static_cast<char*>(dst); const char *psrc=static_cast<const char*>(src); if (dst>src&&pdst<psrc+count) //内存重叠 { pdst=pdst+count-1; psrc=psrc+count-1; while (count--) { *pdst=*psrc; pdst=pdst-1; psrc=psrc-1; } } else //内存不重叠 { while (count--) { *pdst=*psrc; pdst=pdst+1; psrc=psrc+1; } } return ret; }
相关文章推荐
- apache2.2 安装php5
- unity博文搜集
- 一个不错的错误提醒宏
- RS-232-C串口通讯协议解析
- 关于设置shadowPath
- [易语言]连接MSSQLSERVER数据库学习
- 在树莓派上一键安装Django
- 解决:The Apache Tomcat Native library which allows 2010-06-03 12:15:57
- C#如何添加鼠标滚轮事件以及判断鼠标滚轮的方向
- 使用apkplug实现Android客户端插件化
- 文件夹监视
- IOS时间处理
- inotify目录监控
- linux部署svn版本库,部署到服务器新项目
- 解决Oracle中Split Partition缓慢的问题
- 链表C++模板实现
- Android访问网络,HttpURLConnection还是HttpClient?
- [原创] 思维导图笔记(二):SQL
- Spring AOP 日志 记录 面向切面编程
- response slider