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



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

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

strcpy函数的实现

面试中手动实现strcpy与memcpy,注意函数实现过程中各方面的考查要点
  • callinglove
  • callinglove
  • 2013年02月21日 10:13
  • 5024

strcpy函数实现的几种方式

C/C++——strcpy函数的实现 和解析 题目:      已知strcpy函数的原型是:          char * strcpy(char * strDest,const char ...
  • liusandian
  • liusandian
  • 2016年08月17日 16:54
  • 483

strcpy的正确实现

http://www.weste.net/2006/2-20/13432127659.html 1.引言    本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面...
  • fycy2010
  • fycy2010
  • 2015年08月16日 23:19
  • 5242

strcpy函数的实现

已知strcpy函数的原型是: char *strcpy(char *dst, const char *src); 实现strcpy函数解释为什么要返回char *假如考虑dst和src内存重叠的...
  • yangquanhui1991
  • yangquanhui1991
  • 2016年07月01日 22:47
  • 1695

strcpy()函数详解

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

strcpy函数详解

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

strcpy函数及注意事项

已知strcpy函数的原型是: char *strcpy(char *dst, const char *src); 要求: 1实现strcpy函数 解释为什么要返回char *假如考虑ds...
  • a45872055555
  • a45872055555
  • 2014年09月01日 10:35
  • 1110

strcmp函数和strcpy函数

(一)strcmp函数            strcmp函数是比较两个字符串的大小,返回比较的结果。一般形式是:                   i=strcmp(字符串,字符串);      ...
  • xuefu2008
  • xuefu2008
  • 2009年10月13日 10:06
  • 141440

C语言中的复制函数(strcpy和memcpy)

PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的算法Time Limit Exceed)于是百度高效算法,本篇讲述预备知识。 1、strcpy和strncpy函数 ...
  • u011391629
  • u011391629
  • 2016年05月14日 17:15
  • 21563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strcpy函数的实现
举报原因:
原因补充:

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