strcpy函数的实现

原创 2012年04月15日 23:23:32

大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是:

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 * 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函数的真正实现吧。



相关文章推荐

strcpy()函数详解

strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下: · 函数声明以及实现代码 char *strcpy(char *dst, const char *src);char ...

strcpy函数详解

strcpy(s1,s2);strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy. 这样s1在内存中的存放为:ch\0; 在cout 如果说s1的长...

c语言strcpy函数的漏洞

函数里的局部变量一般都是按序排放的,并且因为是分配在堆栈之中,它们的地址是向下“增长”,即向低地址方向增长。...

C/C++——strcpy函数的 几种 实现 和 详细 解析

C/C++——strcpy函数的实现 和解析 题目:      已知strcpy函数的原型是:          char * strcpy(char * strDest,const char * s...
  • wconvey
  • wconvey
  • 2014年03月13日 07:39
  • 27766

小心使用strcpy函数时越界

在讲strcpy函数的一个陷阱之前,先看一段以下的程序: #include #include int main(int argc, char *argv[]) { int flag ...

库函数strcpy的工作方式

strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include 功能:把src所指由NULL结束的字符串复制到dest所指...

编写一个标准strcpy函数

1、字符串的拷贝函数 2、 3、 4、
  • wwkaven
  • wwkaven
  • 2014年08月13日 07:51
  • 1171

strcpy函数的实现

面试中手动实现strcpy与memcpy,注意函数实现过程中各方面的考查要点

strcpy函数实现

strcpy函数实现 要求:不使用c++/c的字符串库函数,实现strcpy函数

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strcpy函数的实现
举报原因:
原因补充:

(最多只允许输入30个字)