关于字符串拷贝问题

mingrijinqing 2012-03-09 06:23:25
今天写了一个字符串拷贝函数:
char *StrCpy(char *DstStr, const char *SrcStr)
{
char *pStr = NULL;

pStr = DstStr;

printf("the src str : %s\n\r", SrcStr);
while((*DstStr ++ = *SrcStr ++) != '\0')
{
;
}

printf("the cpy str : %s\n\r", pStr);

return pStr;
}

//在while循环这,如果将DstStr换成pStr,就无法拷贝内容,打印为乱码。为什么会出现这种情况,难道这时候pStr和DstStr不是指向同一个内存么?

望高人帮答疑。十分感谢。
...全文
193 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
应该是拷贝成功了,只是输出的时候有问题,因为这个时候你的 pStr已经指向串尾了,如果你在输出的时候用DstStr结果还是正确的,另外最好不要这样,这样容易引起内存在分配的时候照成内存溢出的问题,因为你的串未指定大小,操作系统根本不知道要给你分配多少内存,如果你输入的超过了系统分配的就会破坏其他程序的数据
xiaohuh421 2012-03-10
  • 打赏
  • 举报
回复
while((*DstStr ++ = *SrcStr ++) != '\0')

*DstStr ++ ,这种类似的写法虽然简单,却很容易出错,也降低了代码可读性.
还有要注意在移动时指针的保存.

如果在while循环那里 将DstStr换成pStr 则pStr最后会移动到串的末尾去了,而你最终又返回了pStr,所以你得到的就是这个串的末尾的指针,而不是串的开头的指针. 你应该返回的是串开头的指针,也就是DstStr;
当然,如果没有 将DstStr换成pStr 时,pStr保存的是串的开始指针,这里不管DstStr如何移动,最终返回PStr都是串的开始指针,所以就能正确了.
楼主还要加强指针的理解啊
northcan 2012-03-10
  • 打赏
  • 举报
回复
这个问题楼主单步调试一下会更清楚:

在执行while循环之前,看一下DstStr、SrcStr、pStr三个字符串指针所指向的内容:

现在只有SrcStr指针,也就是源字符串指针指向待拷贝的字符串“hello world!”。

而while循环执行之后,printf打印pStr之前,再看一下DstStr、SrcStr、pStr三个字符串指针所指向的内容:

很显然,现在只有DstStr指针所指向的内容才是“hello world!”,而pStr和SrcStr两个指针由于while里面的不断++操作,它们的指向的位置不断后移,现在并不指向待拷贝的字符串“hello world!”了。所以实际打印出来什么就随机了。
x332363930 2012-03-10
  • 打赏
  • 举报
回复
简单的说就是 pStr 移动到字符串的后面去了...
AnYidan 2012-03-09
  • 打赏
  • 举报
回复
*DstStr ++ 不是在移动指针吗?

*DstStr++ 等价于 DstStr++,*DstStr;
chenzuzhang 2012-03-09
  • 打赏
  • 举报
回复
这是因为如果将DstStr换成pStr,那么printf("the cpy str : %s\n\r", pStr);中的pStr在前面已经进行了多次++运算,pStr已经指向了字符串末尾,如果这样输出,肯定是乱码了,明白了吗?
pStr和DstStr一个用于自增,一个用于输出,就没有问题了。

xzjlcyz 2012-03-09
  • 打赏
  • 举报
回复
这里问题很多,我不知道怎么说!
调试的时候发现pStr是一个字符指针!当然这不是重点!
重点是pStr在循环的时候已经偏移出去很远了!得到的自然是乱码!在while循环这,如果将DstStr换成pStr
那么你打印的时候,pStr已经指向字符串尾!
jixingzhong 2012-03-09
  • 打赏
  • 举报
回复
在while开始执行的时候是pStr = DstStr,
但是while执行完毕之后,这两个就不相等啦。

如果在while循环这,如果将DstStr换成pStr,
那么printf("the cpy str : %s\n\r", pStr);这里,
把pStr换成DstStr就可以了。
W170532934 2012-03-09
  • 打赏
  • 举报
回复
我觉得好像是可以的吧。你是不是想得到那个pstr的指针????那是个临时变量,函数结束后就被系统收回了哦。

69,364

社区成员

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

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