面试题 自己实现strcpy 函数

原创 2014年05月04日 21:35:54

经常看到需要自己实现字符串拷贝函数,网上也有很多博文,但是很多实现都是忽略了一些问题。

具体看代码分析。

#include <iostream>
#include <assert.h>

using namespace std;
//这个写法是比较常见的写法,但是这样处理内存重叠情况会崩溃
char *MyStrcpy(char *des,const char *src)
{
	assert(des!=NULL);
	assert(src!=NULL);
	char *res=des;
	while ((*des++=*src++)!='\0')
	{

	}
	return res;
}

char *my_strcpy(char *dst,const char *src)
{
	assert(dst != NULL);
	assert(src != NULL);
	char *ret = dst;
	memcpy(dst,src,strlen(src)+1);//把src中的'\0'也复制过去,strlen 只计算了字符串长度
	return ret;
}
/*memcpy 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用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;
}

int main()
{
	char str[10]="abc";
	char *des=new char[10];
	//cout<<my_strcpy(str+1,str)<<endl;//处理内存覆盖问题
	cout<<str<<endl;
	//cout<<MyStrcpy(str+1,str)<<endl;//程序出现崩溃
	cout<<strcpy(str+1,str)<<endl;
	cout<<str<<endl;
	cout<<my_strcpy(str+1,str)<<endl;
	cout<<str<<endl;
}


 

相关文章推荐

strcpy的正确实现

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

strcpy函数的实现

大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是: char *my_strcpy(char *dst,const char *src) { assert(ds...
  • Gpengtao
  • Gpengtao
  • 2012年04月15日 23:23
  • 81760

strcpy函数的实现

已知strcpy函数的原型是: char *strcpy(char *dst, const char *src); 实现strcpy函数解释为什么要返回char *假如考虑dst和src内存重叠的...

strcpy与strncpy的区别

strcpy:字串复制   原型:char *strcpy(char *dest, char *src);   功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。 ...

LuaJava:跟着LuaJava一步一步学习JNI -1

LuaJava:跟着LuaJava一步一步学习JNI -1

Android中Java和JavaScript交互解决方案,以及问题解决大全

转载:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/ Android...

经典面试题之7 编写类似strstr/strcpy/strpbrk的函数

原文:http://blog.csdn.net/v_JULY_v/article/details/6417600   面试考察的是你对基础知识的掌握程度,及编程能力是否过硬的一种检测...

面试题之strcpy/strlen/strcat/strcmp的实现

阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了。最后写是写出来了,但没考虑异常的情况,面试官好像很不满意...

常见笔试题-Strcat,strcpy,strcmp,Strlen函数原型 + Strlen几种实现

这几个函数在面试的时候经常被考到,但没看过要准确又完美的写出来也不是易事,传说IBM曾经也考过写strcpy原型,说明这几个函数真的很有代表性,因此记于此处以便温习。 以下皆经本人调试过。 1、Str...

面试题:char * strcpy(char * strDest,const char * strSrc);

题目: 已知strcpy函数的原型是:         char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strc...
  • HONDELY
  • HONDELY
  • 2011年10月18日 04:16
  • 5677
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试题 自己实现strcpy 函数
举报原因:
原因补充:

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