库函数strcpy实现出现乱码,求大神指点

一粒_米 2013-10-14 10:36:24
一下是我写的程序:
#include <iostream>
#include<assert.h>
using namespace std;
char * strcpy(char *dest,const char *src)
{
assert((*src!=NULL) && (*dest!=NULL));
/*while(*src)
{
*dest=*src;
dest++;
src++;
}*/
//while((*dest++ = *src++)!='/0');
for(int i=0;i<strlen(src);i++)
{
dest[i]=src[i];
}
return dest;
}
int main()
{
const char src[]="abcdef";
//char* dest=new char[sizeof(src)];
char dest[]="123456ghijklm";
cout<<strcpy(dest,src)<<endl;
return 0;
}

以上代码可以得到正确结果,但是用注释起来的代码就会出现乱码,想不通,大神指点下,感激不尽!
...全文
309 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-10-15
  • 打赏
  • 举报
回复
/和\不是一回事!
gzshun 2013-10-15
  • 打赏
  • 举报
回复
for(int i=0;i<strlen(src);i++)
lin5161678 2013-10-15
  • 打赏
  • 举报
回复
char dest[]="123456ghijklm"; 没人说 这个缓冲区 太小吗
lm_whales 2013-10-15
  • 打赏
  • 举报
回复
一份可用的代码:
char * strcpy(char *dest,const char *src)
{
assert((*src!=NULL) && (*dest!=NULL));
//置成空串,可以保证代码的健壮性。
//不处理,可以保证代码的效率。 
//下面这几条,语句和strcpy的功能无关,
//只是出于防御编程的目的,
//以减少非法使用,这个函数,造成的错误,保护代码的安全。
if(!dest)return NULL;
if(!src) { *dest ='\0'; return dest; } 
//主体代码:
char *ret = dest;// 保存dest 
//这二者,任何一个,都可以用作返回值,那么,另外一个,就用于数据复制。
while(*dest++ = *src++);
return ret;
}
1)代码有问题,'/0'不是结束符,而且返回值错误。
while((*dest++ = *src++)!='/0');//???????????????
//'/0'是啥?????,方向反了吧!!!,不知,到了何时,才能结束复制呢。
//应该是
while((*dest++ = *src++)!='\0');
//吧!
//虽然这样改,复制是成功了,
//不过
return dest;
//却是错误的,返回野指针了。
2)这段代码,没有复制结束符,返回值也不对。
/*
while(*src)
{
*dest=*src; //*src =0 时,这个语句执行不到。
dest++;
src++;
}

*/
//貌似和
//while((*dest++ = *src++)!='\0');
//以及
//while(*dest++ = *src++);    //先复制,再判断,所以结束符,已经悄悄复制好了。
//相同,其实少做一件事。结束符,没有复制。

//另外,这里没有保存 dest 的首地址。
//即便复制成功 ,dest 现在指向,结束符后面了。  
return dest;//返回野指针了吧。
3)修改一下,结束符复制了,返回值也没有问题,但是没有处理异常情况。
for(int i=0;i<strlen(src);i++)
{
dest[i]=src[i];//这个也不会,复制结束符。
}
//改成这样,就可以了
for(int i=0;i<=strlen(src);i++)
{
dest[i]=src[i];//会复制,结束符了。
}
一粒_米 2013-10-15
  • 打赏
  • 举报
回复
谢谢5楼大神,也谢谢其他朋友,出现乱码的主要问题是/0!应该写成\0
ztenv 版主 2013-10-14
  • 打赏
  • 举报
回复
引用 1 楼 ganpengjin1 的回复:
//while((*dest++ = *src++)!='/0'); 应该返回dest的首地址,而不是移动后的dest
没错,没错,
max_min_ 2013-10-14
  • 打赏
  • 举报
回复
在函数开始加上char *tmp = dest; 然后 返回 tmp试试
一粒_米 2013-10-14
  • 打赏
  • 举报
回复
引用 1 楼 ganpengjin1 的回复:
//while((*dest++ = *src++)!='/0');

应该返回dest的首地址,而不是移动后的dest


用这条代码的时候,我试过返回首地址,但是运行的时候程序直接崩溃。
漫步者、 2013-10-14
  • 打赏
  • 举报
回复
//while((*dest++ = *src++)!='/0'); 应该返回dest的首地址,而不是移动后的dest

64,639

社区成员

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

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