有关拷贝函数的实现----MS面试题

Amoon100 2005-07-21 05:59:31
前几天看了林锐的书,说MS面试他的时候让他写拷贝函数。昨天自己试着写了一下,还是没有写出来,(结果不满意)主要出在当from串的长度大于to 分配的内存时会出问题。(在函数体内无法得到参数所分配内存块的大小)结果在vs6 下,
1) 在Debug下编译链接通过后运行完了后,弹出对话框说DEBUG ERROR
2)在Release下运行结果正常。
为:
f=12345678912345
t=12345678912345
这显然是有问题的。


敢问高手Strcpy()函数到底要咋样写。

//
#include<iostream.h>
#include<assert.h>
#include<string.h>
#include<stdio.h>
void stringcpy(char *to,const char *from) //使用时保证from小于to指向的内存块
{
assert(from!=NULL&&to!=NULL);

while(*from!=0)
{
*to=*from;
to++;
from++;
}
*to=0;



}
void main()
{
char *f,*t;
f=new char[15];
t=new char[10];


//strcpy(t,"wo dslfjlsjflsjfldjsfljds");
//调用c库函数。运行时与stringcpy效果相同
stringcpy(f,"12345678912345"); // f满了
stringcpy(t,f); //t内存越界
cout<<"f="<<f<<endl<<"t="<<t<<endl;
delete f;
delete t;
f=NULL;
t=NULL;
getchar();


}
...全文
965 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
oosky2004 2005-08-24
  • 打赏
  • 举报
回复
恩,学习了不少东西。。。。。
defyer007 2005-08-19
  • 打赏
  • 举报
回复
to jiajun2001(嘉俊):看见汇编真亲切啊,好久没用了~<!e!>
void strcpy(char *to, char *from)

{
while(*to++ = *from++);
}

这个库函数,大家仔细看看就发现,它只是将内容复制过去,其他的一概不负责任,所以内存的管理就需要我们自己费神了
OracleCoder 2005-08-19
  • 打赏
  • 举报
回复
Mark
benjiam 2005-08-19
  • 打赏
  • 举报
回复
还有,如果考虑得更多应该检测缓冲区是否相互重叠,这将决定复制的方向。

这个问题 在微软的 编写无错代码一书里面有提到过的 它还要求 from+ len < to
和to +len < from

北极猩猩 2005-08-19
  • 打赏
  • 举报
回复
问题是要写得到底是strcpy还是memcpy啊。
还有,是不是要写成strncpy,就是是不是要检查缓冲溢出。

还有,如果不是使用汇编来实现(汇编中可能会有块复制的指令),在以sizeof(int)作为单位进行复制的效率会更高。

还有,如果考虑得更多应该检测缓冲区是否相互重叠,这将决定复制的方向。
bugebear3 2005-08-18
  • 打赏
  • 举报
回复
献丑一下了,呵呵

char * strcpy(char * strDest, const char * strSrc)
{
assert(NULL != strDest && NULL != strSrc);
char * address = strDest;
while('\0' != (*strDest++ = *strSrc++) )
;
return address;
}



}
zhuangxingzan 2005-08-17
  • 打赏
  • 举报
回复
一个memcpy的实现,顺便发上来。偶用来面试的:
void* MyMemoryCopy(void *pvTo, const void *pvFrom, size_t size)
{
//assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
if(NULL == pvTo || NULL == pvFrom)
throw "pvTo or pvFrom Invalid!!!";

unsigned char *pbTo = (unsigned char *) pvTo; // 防止改变pvTo 的地址
unsigned char *pbFrom = (unsigned char *) pvFrom; // 防止改变pvFrom 的地址

while(size > 0 )
{
//*pbTo ++ = *pbFrom ++ ;
*pbTo = *pbFrom;
pbFrom++;
pbTo++;
size--;
}

return pvTo;
}
slashjojo 2005-08-17
  • 打赏
  • 举报
回复
不能,是让他在用之前考虑一下越界问题。
improgrammer 2005-08-17
  • 打赏
  • 举报
回复
老问题了,
1、函数只是提供方便,而安全问题是个资源管理问题;
2、谁管理资源,谁就负责资源的安全使用;
3、既然目标内存块不是本函数分配的,它何从知道有多大容量?
4、调用者要制造内存溢出的话,strncpy就能阻止吗?
zhuangxingzan 2005-08-17
  • 打赏
  • 举报
回复
char* MyStringCopy(char* desStr, const char* resStr)
{
//assert((desStr != null) && (resStr != null));
if( null == desStr || null == resStr)
throw "Destory or ResString Invalid!!!";

char* pDesStr = desStr;
while(*resStr != '/0')
{
*desStr = *resStr;
resStr++;
desStr++;
}

return pDesStr;
}
slashjojo 2005-08-17
  • 打赏
  • 举报
回复
担心弄跨你就用strncpy
Baku 2005-07-27
  • 打赏
  • 举报
回复
void strcpy(char *to, char *from)

{
while(*to++ = *from++);
}


//========================================
标准库中的应该是这样的,呵呵,效率高啊,不过不知道为什么没有到考虑到别的因素,主要目的是为了效率吧!

长知识了,他居然没安全保证,岂不很容易弄垮?
Amoon100 2005-07-26
  • 打赏
  • 举报
回复
谢谢大家的支持,特别是水妖!
辛苦了!
wave2050 2005-07-25
  • 打赏
  • 举报
回复
是不是加一个*from!='\n'??
lonelyforest 2005-07-25
  • 打赏
  • 举报
回复
void strcpy(char *to, char *from)

{
while(*to++ = *from++);
}


//========================================
标准库中的应该是这样的,呵呵,效率高啊,不过不知道为什么没有到考虑到别的因素,主要目的是为了效率吧!

HermeX 2005-07-24
  • 打赏
  • 举报
回复
faithcj(水妖) 我看了你的blog,写得很好。我有一个问题不明白向你请教
最后那个s[]被d[]覆盖的问题。你的解释我看懂了,但不明白明明先申明s[]后申明d[],为什么在内存中是先存d[]后存s[]?
zhangcloud 2005-07-24
  • 打赏
  • 举报
回复
mark
回家好好学习一下

HermeX 2005-07-24
  • 打赏
  • 举报
回复
这个问题我就不明白了。string.h中的 strcpy()也没处理关于越界的问题啊。
程序x人生 2005-07-24
  • 打赏
  • 举报
回复
这个问题我去面试时真遇见过了,回来后我研究了几天才基本清楚了,详情请见我的blog文章:http://yluo09.blogchina.com/2295822.html

ms对strrcpy的设计思想是要求程序员使用它前先给目标字串分配足够的空间,在strrcpy里是不负责内存的分配的。这样做的原因大概是防止在strcpy的申请的空间忘了释放。
HermeX 2005-07-24
  • 打赏
  • 举报
回复
这些库函数不提供安全检查,程序员还不是要检查,这并没有提高效率啊
加载更多回复(15)

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧