为什么这个strcat用不起?

fxc123 2004-10-23 05:41:35
char* Strcpy(char* des,char* sour)
{
char* temp=des;
while(*temp)
temp++;

while(*temp=*(sour++))
temp++;

return des;

}
问题在第一个while循环,用
while(*temp)
temp++;
就可以。
为什么呢?
...全文
517 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujingfu123 2004-10-25
  • 打赏
  • 举报
回复
晕了……在程序正确的前提下还是把程序的可读性放在首要位置吧…… 过分追求代码的简洁就会使程序看起来很费神的……
cxjddd 2004-10-24
  • 打赏
  • 举报
回复
到底是 strcat 还是 strcpy >_<
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
*temp++ ===>*(temp++) ===> *temp temp++
先取值作运算,后++
-----
先做++,temp加1,但temp++的值是作自增运算前temp的值
*(temp++)是取表达式temp++的值,所以。。。
road1981 2004-10-24
  • 打赏
  • 举报
回复
复杂的表达式是错误的根源...Bjarne大大的话是真理
  • 打赏
  • 举报
回复
那是,最少一个可分开,一个不可分开嘛。
烂笔头Danky 2004-10-24
  • 打赏
  • 举报
回复
虽然在语法上*temp++;是等价于*temp;temp++;但在不同时候还是会有不同的!
  • 打赏
  • 举报
回复
char temp[4];
char *p = temp;
temp[0] = 'a';
temp[1] = 'b';
temp[2] = 'c';
temp[3] = 0;
char c = *p++;===> c = 'a'; p->temp[1]


  • 打赏
  • 举报
回复
没错啊,只是在while(*temp++);的单个循环中temp的值不变,该轮循环结束后temp就变了。
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
楼上的,看看后缀运算符再说吧。^_^
  • 打赏
  • 举报
回复
*temp++ ===>*(temp++) ===> *temp temp++
先取值作运算,后++
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
注意*temp++等价于*(temp++)
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
while(*temp++)在判断了*temp的值为假后不会马上退出
=====================
不对!
while(*temp++)
;
在对*temp++进行判断,先temp++,由于是后缀,temp++表达式的值并不变,所以*temp++还是指向原来的字符。
  • 打赏
  • 举报
回复
孺子可教
fxc123 2004-10-24
  • 打赏
  • 举报
回复
也就是说
while(*temp++)在判断了*temp的值为假后不会马上退出
要等*temp++再执行一次后才会结束?
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
#include <stdio.h>
char* Strcat(char* des,char* sour)
{
char* temp=des;
while(*temp++)
;
//要象你那么用,由于多移动了一次,所以要加上下面的语句
//这样就正确了
temp--;
while(*temp=*(sour++))
temp++;
return des;

}

void main()
{
char str1[80]="abcd";
char *p="efg";
printf("%s\n",str1);
Strcat(str1,p);
printf("%s\n",str1);
}
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
while(*temp++)
;

while(*temp)
temp++;
它们还是有不同的。
假设temp指向str[]="abcd"
对于第一个循环
循环次数 判断的*temp++ temp指针指向了
1 'a' 'b'
2 'b' 'c'
3 'c' 'd'
4 'd' '\0'
5 '\0' '\0'后面的字符去了,多移动了一个,所以这里引起了问题
出现了你的错误。


而对于第二个循环,
循环次数 判断的*temp temp++;,移动指针指向
1 'a' 'b'
2 'b' 'c'
3 'c' 'd'
4 'd' '\0'
5 '\0' 退出循环,temp没有移动

这就是问题的所在

zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
差不多了
fxc123 2004-10-24
  • 打赏
  • 举报
回复
懂了
关键就是*(temp++)
取得是上一次的值
对不?
zhangfjj 2004-10-24
  • 打赏
  • 举报
回复
为什么不等?
char* Strcpy(char* des,char* sour)
{
char* temp=des;
while(*temp)
temp++;

while(*temp=*(sour++))/*<-------------这里写成下面的形式*/
temp++;
return des;

}


while(*temp++=*(sour++))
;
是可以的

bluwindhrt 2004-10-24
  • 打赏
  • 举报
回复
while(*temp++);
不等于:
while(*temp) temp++;
加载更多回复(17)

69,369

社区成员

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

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