自己写的strcpy,得不到正确结果

arden1019 2005-08-12 10:11:17
char * strcopy2(char * szDst, const char * szSrc);

const char *ps="i'm source arden";
char *qs="";


int main ()
{
qs=strcopy2(qs,ps);
printf("ps is %s\n",ps);
printf("qs is %s\n",qs);
return 0;


}

char * strcopy2(char * szDst, const char * szSrc)

{

char * szTemp = szDst;

while (*szDst++ = *szSrc++);

*szDst = '\0';

return szTemp;

}

输出为:
ps is i'm source arden
qs is i'm source ardenH 7

但是我在调试时候在while循环中添加了一个printf,结果就正确了:
while (*szDst++ = *szSrc++){printf("\n");}

输出:
















ps is i'm source arden
qs is i'm source arden

为什么呢?
...全文
230 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
smjacky 2005-08-12
  • 打赏
  • 举报
回复
你没有为 qs 分配内存啊
还有,干吗要用全局变量呢
非到万不得以,最好不要用全局变量
你的程序这样就可以了

#include <iostream>
using namespace std;

char* strcpy2(char *dest, const char *src)
{
while(*dest++ = *src++);

return dest;
}

int main()
{
char *str1 = "hello world";

char *str2 = (char*)malloc(strlen(str1) + 1);//分配相应大小的空间
char str3[20];//或者用字符数组

strcpy2(str2, str1);
strcpy2(str3, str1);

cout<<str2<<endl;
cout<<str3<<endl;

return 0;
}
glang010 2005-08-12
  • 打赏
  • 举报
回复
错在qs=
shitman 2005-08-12
  • 打赏
  • 举报
回复
to bilujun(编程低手)

这个问题在以前我也经常碰到,不过没有仔细去想,只是想办法避开这个问题。
不过这个问题却一直困扰着我,按理来说这样做应该是可行得啊。
bilujun 2005-08-12
  • 打赏
  • 举报
回复
to shitman(shitman)
就是啊,为什么啊?
char qs[20];
qs=strcopy2(qs,ps);
qs=strcopy2(&qs[0],ps);

按道理上面的应该调用都可以啊?是不是vc编译器有问题啊?
jlkzzh 2005-08-12
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void strcopy2(char * szDst, const char * szSrc);
const char *ps="i'm source arden";
char *qs="";
int main ()
{
qs=(char*) malloc((strlen(ps)+1)*sizeof(char));
strcopy2(qs,ps);
printf("ps is %s\n",ps);
printf("qs is %s\n",qs);
free(qs);
return 0;
}
void strcopy2(char * szDst, const char * szSrc)
{
char * szTemp = szDst;
while (!(*szSrc =='\0'))
{
*(szTemp++) = *(szSrc++);
}
*szTemp = '\0';
}
copygirl 2005-08-12
  • 打赏
  • 举报
回复
我晕了,原来是这样:
while (*++desc = *src++);
它有一个先判断再++,还是先++再判断字符串是否再结束的问题,-_-!

printf("qs is %s\n",&qs[1]);这样才可以打印出qs

原因:
判断后,src先执行赋值操作,再++,而desc在这之前就++了
KDE 2005-08-12
  • 打赏
  • 举报
回复
char *qs="";????

不能这样吧??空间都没有分配,这只是一个常量字符串,类似于const char *qs="";

改为:char qs[255];吧。
shitman 2005-08-12
  • 打赏
  • 举报
回复
char * strcopy2(char * szDst, const char * szSrc);

const char *ps="i'm source arden";
char qs[20];


int main ()
{
qs=strcopy2(qs,ps);
printf("ps is %s\n",ps);
printf("qs is %s\n",qs);
return 0;


}

char * strcopy2(char * szDst, const char * szSrc)

{

char * szTemp = szDst;

while (*szDst++ = *szSrc++);

//*szDst = '\0';

return szTemp;

}




D:\test\string\string.cpp(9) : error C2440: '=' : cannot convert from 'char *' to 'char [20]'

为何
jixingzhong 2005-08-12
  • 打赏
  • 举报
回复
你的程序错误在于没有申请指针的空间久使用,非法了...

程序增加了一个缓冲 ,OK 了 ..
jixingzhong 2005-08-12
  • 打赏
  • 举报
回复
char * strcopy2(char * szDst, const char * szSrc);

const char *ps="i'm source arden";
char s[30];
char *qs=" ";

main ()
{
qs=strcopy2(s,ps);
printf("ps is %s\n",ps);
printf("qs is %s\n",qs);

getch();
}

char * strcopy2(char * szDst, const char * szSrc)
{
char *szTemp = szDst;
while (*szDst++ = *szSrc++);
*szDst = '\0';
return szTemp;
}
copygirl 2005-08-12
  • 打赏
  • 举报
回复
嘿嘿,NND,这样就能打印出来:
while ( (*szDst++) = (*szSrc++) )
printf("%c\n",*qs++);
说明已经写进去了,为什么最后内容为空?
bilujun 2005-08-12
  • 打赏
  • 举报
回复
YanDong_8212(谢科)的
qs = (char*)malloc(sizeof(char)*strlen(ps));
应该改成
qs = (char*)malloc(sizeof(char)*strlen(ps)+1);
要考虑有一个'\0'
ben_na 2005-08-12
  • 打赏
  • 举报
回复
其实这样就可以
char* copy2(char* desc, const char* src) {
char* result = desc;
while (*desc++ = *src++);
return result;
}
bilujun 2005-08-12
  • 打赏
  • 举报
回复
你贴出来的这段代码能运行吗?
qs指针指向的是常量,能执行while (*szDst++ = *szSrc++)吗?
Baku 2005-08-12
  • 打赏
  • 举报
回复
你的程序好多东西没考虑...
YanDong_8212 2005-08-12
  • 打赏
  • 举报
回复
qs的定义改成char *qs = NULL;
在main()函数中加一句:
qs = (char*)malloc(sizeof(char)*strlen(ps));
Baku 2005-08-12
  • 打赏
  • 举报
回复
*szDst = '\0'; 去掉看看
YanDong_8212 2005-08-12
  • 打赏
  • 举报
回复
如果你用高级编译器,根本通不过。
char *qs="";是指向空字符穿常量的指针。你在程序中传入了这个指针,然后你要改变它后继的值,你有没有考虑到后面的地址是否允许访问?所以说,就是一个指针问题。可能你用的编译器是比较低的,所以侥幸通过了。
arden1019 2005-08-12
  • 打赏
  • 举报
回复
to: jixingzhong(瞌睡虫
你的程序错误在于没有申请指针的空间久使用,非法了...

程序增加了一个缓冲 ,OK 了 ..

也就是说我char *qs="";后,其实只是申请了一小段内存。而ps比qs长,ps的'\0'没有复制到qs中?我已经在while后面加了一条*szDst = '\0'啊;

那为什么我:

在while循环中添加了一个printf,结果就正确了:
while (*szDst++ = *szSrc++){printf("\n");}

??
ltc_mouse 2005-08-12
  • 打赏
  • 举报
回复
char qs[20];
qs=strcopy2(qs,ps);
按道理上面的应该调用都可以啊?是不是vc编译器有问题啊?

-----------------------
同意glang010() ( ) ,错在qs=

qs是字符串qs[20]的首地址,不可写,否则下一次访问qs[i]时,编辑器无法处理...

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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