请写一个函数,实现类似的strcpy的字符串复制功能
来源:互联网 发布:校园网络平台建设计划 编辑:程序博客网 时间:2024/05/18 00:50
这个题目看起来很简单,但要完整的实现其功能还是得下的功夫
先来看下一个经典错误的程序
char * mystrcpy(char *dest,char *src){char *ret;dest=(char *)malloc(strlen(src)+1);ret=dest;if(dest){while(*dest++=*src++);return ret;}elseprintf("error\n");}
通常情况下虽然能输出正确的答案,但是这个函数式有问题的。
这里主要错误是改变了dest指针,使其重新指向了一个从堆区分配的地址,函数结束时,堆区资源释放,是其分配的区域变得不可用。
接下来对这个函数进行改进
这里注意的几点如下:
1 dest src不能为空指针
2 函数内不能修改dest src指针
3 当dest 与 src 出现内存重叠式时该如何处理
char * mystrcpy(char *dest,char *src){char *d=dest;char *s=src;int count=0;assert((dest!=NULL)&&(src!=NULL) );if(src==dest)return src;count=strlen(src)+1;if(count<=1)return 0;if((dest<src)|| dest >=(src+count)) //第一、二种情况{while(count--){*d++=*s++;}}else //第三种情况{d+=count;s+=count;while(count--){*d--=*s--;}}return dest;}
上面程序是经过修改过的。
现在重点分析下内存区域重叠问题, 在嵌入式里,经常要操作地址值,所以出现内从重叠现象是经常发生的。
src dest指针分布情况有三种情况,如下图所示。
接下来重点看下第三种情况下的主函数代码
int _tmain(int argc, _TCHAR* argv[]){ char src1[20]="hello world";char *src2=(char *)(src1)+2;char *dest1=src2;dest1=mystrcpy(src2,src1);printf("%s\n",dest1);}
此时src1与src2在内存中的布局如上图所示,属于第三种情况。
- 请写一个函数,实现类似的strcpy的字符串复制功能
- 写一个函数,实现字符串的复制
- 写一个功能类似字符串title()方法的函数
- 字符串复制函数strcpy的实现算法
- 不用strcpy函数实现字符串复制功能
- 写一个strcpy函数的实现
- 复制字符串,实现strcpy功能
- 自己模拟strcpy库函数写的功能函数my_strcpy实现strcpy的功能,完整代码
- 类似strstr/strcpy/strpbrk函数的实现
- C语言 不使用strcpy 函数实现字符串复制功能
- 写一个类似与CASE功能的状态切换函数
- 重写strcpy 实现字符串的复制
- 实现一个同strcpy功能相同的函数mystrcpy
- 自己写的 字符串函数strcpy
- 请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- 如何写一个漂亮的strcpy函数
- 自己写的一个strcpy函数
- 写程序实现自己的strcpy() 函数
- netbeans 发送ftp文件失败 解决方法
- 用MySQL创建数据库和数据库表
- 浅谈管理系统操作日志设计(附操作日志类)
- 【windows8开发】Metro App生命周期之Suspended与Resume
- IT札记- 真实云世界的端倪
- 请写一个函数,实现类似的strcpy的字符串复制功能
- Cocos2d中,我们让CCSprite也可以接受触摸。
- 写接口的一些调式方法
- csdn 积分记录
- 学习笔记 Hadoop是什么?
- 虚拟主机为什么使用 CloudLinux 作为服务器系统?
- 接口
- 变态的C++函数指针
- Spring.NET学习笔记6——依赖注入(应用篇) Level 300