其实这也是一个简单的问题,当时我考虑太多了,居然还考虑如果不能完全装进去要不要申请新的空间。
后来后头才发现...
原型声明: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>首先要检测两个指针的有效性,然后就是在while里面判断循环的终止条件,最后的话看需要是否需要返回值。
#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();
}
上面的是不考虑内存重叠的这种情况。如果内存重叠,建议使用一个网友的做法。
地址: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;
- }
- 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;
- }
——————————————————————————————————————————————————————————————————
//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。
转载请注明出处:http://blog.csdn.net/qq844352155
author:天下无双
Email:coderguang@gmail.com
2014-10-31
于GDUT
——————————————————————————————————————————————————————————————————