strcpy实现 处理地址重叠,返回值问题
2013-10-25 23:00
435 查看
strcpy的主要功能就是将原串拷贝到目标,一个比较简单的实现版本为
比较常用的实现是以上那个版本,那么这个函数其实是由很多问题的,我们进行第
问题1、将src++和dest++写在while循环的条件式里面,这样做的好处是有些编译器会对这种操作做些优化,而且编译出来的汇编码也会简短很多
问题2、传入的src指针我们不需要更改它的位置,那么它应该为const
问题3、没有处理src和dest地址出现交叠的情况,当&src<&dest时,按照如上代码就会出息问题,比如:src=“abcd” &src=0001,&dest=0002
第一次循环地址为0002的值被赋值为a,那么也就是说src中第二个字符b已经被更改为a,那么第二次循环时dest的值就会变成“aa”。解决这个问题的办法就是需要从后向前拷贝,那么代码就会变成
问题4、上面的代码看起来是安全的了,但还有一个返回值的问题,的确以void作为返回值没有什么问题,但如果将dest的指针作为返回值有一个作用:生成链式表达式。
比如这样的代码:
好吧,多写了一行代码。。。。其实我也没有理解链式表达式最大的优势在哪里,如果只是为了减少一行代码,我个人觉得没有太多必要,如果有哪位前辈晓得可以指点一二,不胜感激。
个人博客:http://www.yancey.info/?p=112
void strcpy(char * dest, char * src) { assert(src!=NULL); assert(dest!=NULL); char *ret = dest while((*ret) = (*src) && (*src)!=‘\0’) { src++; ret++; } }
比较常用的实现是以上那个版本,那么这个函数其实是由很多问题的,我们进行第
问题1、将src++和dest++写在while循环的条件式里面,这样做的好处是有些编译器会对这种操作做些优化,而且编译出来的汇编码也会简短很多
问题2、传入的src指针我们不需要更改它的位置,那么它应该为const
void strcpy(char* dest, const char* src) { assert(src!=NULL); assert(dest!=NULL); char *ret = dest; while((*ret++t) = (*src++) && (*src)!=‘\0’) { } }
问题3、没有处理src和dest地址出现交叠的情况,当&src<&dest时,按照如上代码就会出息问题,比如:src=“abcd” &src=0001,&dest=0002
第一次循环地址为0002的值被赋值为a,那么也就是说src中第二个字符b已经被更改为a,那么第二次循环时dest的值就会变成“aa”。解决这个问题的办法就是需要从后向前拷贝,那么代码就会变成
void strcpy(char* dest, const char* src) { assert(src!=NULL); assert(dest!=NULL); char *ret = dest; if (src < dest) while((*ret++t) = (*src++) && (*src)!=‘\0’) { } else if { int len = strlen(src); while (len—) { *(ret + len) = *(src + len); } } else {} }
问题4、上面的代码看起来是安全的了,但还有一个返回值的问题,的确以void作为返回值没有什么问题,但如果将dest的指针作为返回值有一个作用:生成链式表达式。
比如这样的代码:
int len = strlen(strcpy(dest, “abcde"));
但如果没有返回值,那么就要写成这样:
char * dest; strcpy(dest, "abcd"); int len = strlen(dest);
好吧,多写了一行代码。。。。其实我也没有理解链式表达式最大的优势在哪里,如果只是为了减少一行代码,我个人觉得没有太多必要,如果有哪位前辈晓得可以指点一二,不胜感激。
个人博客:http://www.yancey.info/?p=112
相关文章推荐
- memcpy memmove区别和实现(如何处理内存重叠问题)
- 关于strcpy与memcpy函数的地址重叠问题
- 书写 strcpy 的实现问题及其返回值 体现编程习惯
- strcpy实现及返回值问题(支持链式表达式,增加了函数的附加值)
- 关于strcpy中的目标/源地址重叠问题
- android实现HttpClient的调用,处理多线程问题
- 处理JSP中文跨页面间传参乱码的问题有两种方法实现方法(每个搞JSP的最常遇到的问题之一) 实例版:)
- nginx rewrite arg 带问号的地址转发参数处理?Nginx重定向的参数问题
- 使用Spring实现异常统一处理【三】--java.lang.IllegalStateException: STREAM问题的解决
- 使用dom4j工具包实现对xml文件的增删改查和乱码问题的处理
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- 常用的字符处理函数实现:strstr strcpy strcat memcpy memmove
- 字符串处理函数的模拟实现(strlen、strstr、strcat、strcmp、strcpy、memmove、memcpy)
- html中提交表单并实现不跳转页面处理返回值
- 如何处理$.getjson 返回值 为空的问题
- 散列表(二):冲突处理的方法之链地址法的实现(哈希查找)
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- 关于strcpy的问题,解释一下为什么VS中标准的方法不用memcpy实现
- 散列表(二):冲突处理的方法之链地址法的实现