笔试面试2用C实现C库的strcpy函数
其实这也是一个简单的问题,当时我考虑太多了,居然还考虑如果不能完全装进去要不要申请新的空间。
后来后头才发现…
原型声明:extern char *strcpy(char* dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
这个函数的前提就是已经有足够的空间来容纳后面的一个字符串。原来是我有点混淆了C的strcpy和strcat !!
对C真心不是太熟,习惯了C++,都快把C给忘了…
这个的实现很简单,但是有很多的细节需要注意。
#include <stdlib.h> #include <stdio.h> #include <assert.h> //for assert char *strcpy(char *str,const char *str2){ assert(str!=NULL&&str2!=NULL);//判断两者是否有一个为空 char *result=str; while((*str++=*str2++)!='\0') ;//一次将字符copy到str return result; } int main() { char str[50]="hello ,c,I love you"; char str2[50]="hello,c!but I love c++ more !!"; printf("str is %s\n",str); printf("str2 is %s\n",str2); strcpy(str,str2); printf("after strcpy(str,str2):str="); printf("%s\n",str); getch(); getch(); }
首先要检测两个指针的有效性,然后就是在while里面判断循环的终止条件,最后的话看需要是否需要返回值。
上面的是不考虑内存重叠的这种情况。如果内存重叠,建议使用一个网友的做法。
地址:http://blog.csdn.net/gpengtao/article/details/7464061/
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 * my_memcpy(void *dst,const void *src,unsigned int count)
- {
- assert(dst);
- assert(src);
- void * ret = dst;
- if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
- {
- while(count–)
- {
- *(char *)dst = *(char *)src;
- dst = (char *)dst + 1;
- src = (char *)src + 1;
- }
- }
- else //源地址和目的地址重叠,高字节向低字节拷贝
- {
- dst = (char *)dst + count – 1;
- src = (char *)src + count – 1;
- while(count–)
- {
- *(char *)dst = *(char *)src;
- dst = (char *)dst – 1;
- src = (char *)src – 1;
- }
- }
- return ret;
- }
两者结合才是strcpy函数的真正实现吧。
——————————————————————————————————————————————————————————————————
//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。
转载请注明出处:http://blog.csdn.net/qq844352155
author:天下无双
Email:coderguang@gmail.com
2014-10-31
于GDUT
——————————————————————————————————————————————————————————————————