还是关于while(*s1++=*s2++)的问题

hackxq 2008-08-19 09:38:14
原来看到大家问过关于这条语句的问题.自己也用过.可现糊涂了.
本意是把s2指向的字符串char b[]复制到s1指向的字符串中.代码如下


#include <stdio.h>

main(){
char a[]={"hello"},b[]={"world"};
char *s1,*s2;
s1=a;
s2=b;
while(*s1++=*s2++);
printf("%s %s",s1,s2);
return 0;

}

用gcc编译的.输出结果是乱码.不太明白这是为什么.
第二个问题是.如果写一个函数

void copyer(char *s1,const char *s2){
while(*s1++=*s2++);
}

copyer(s1,s2)后,再输出,结果就是对的.即:world world.这里就更不明白是为什么了.请高手指教.多谢
...全文
637 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjzrd 2008-08-19
  • 打赏
  • 举报
回复
S1已经不是指向首地址了 你已经变动了
freshui 2008-08-19
  • 打赏
  • 举报
回复
你的s1 和 s2被++到字符串的\0之后的哪个位置了
当然是乱骂了
hackxq 2008-08-19
  • 打赏
  • 举报
回复
刚看到3楼朋友的回复,明白了.一看到是指针传进函数就忽略作用域问题了.非常感谢楼上几位.多谢
hackxq 2008-08-19
  • 打赏
  • 举报
回复
谢谢楼上两位,改成printf("%s,%s",a,b)后输出正确了.我太菜了.还是有点不太明白.
如果不调用copyer(),在经过while(*s1++=*s2++)操作后,
字符串a[]应该是"world"了吧?这时printf("%s %s",s1,s2),s1指向的是a[]的首地址吗?
用copyer()的话,也是只进行while(*s1++=*s2++)操作后就进行的printf("%s %s",s1,s2)操作啊.
e_sharp 2008-08-19
  • 打赏
  • 举报
回复
while(*s1++=*s2++);
printf("%s %s",s1,s2);

------------------

s1,s2都已经移动了,不再是起始地址了
printf("%s %s",a,b); //这样就可以了

copyer(s1,s2) //main中的s1,s2并没有改变,仍然是起始地址,所以printf正常
realdragon2 2008-08-19
  • 打赏
  • 举报
回复
s1,s2已经发生改变了, 你在printf输出的时候当然不会是正确结果.
将printf语句改为; printf("%s,%s",a,b); 输出结果就正确了.

另外, 建议在定义并初始化数组的时候把两边的那个大括号去掉, 加上有用吗? 还难看.

第二个问题:
coper函数传入的是两个字符串空间的首地址, 然后在while循环中赋值当然是正确的.
lzr4304061988012 2008-08-19
  • 打赏
  • 举报
回复

#include <stdio.h>

void main(){
char a[]="hello",b[]="world";
char *s1,*s2;
s1=a;
s2=b;
while( *s1++ = *s2++ );

printf("%s %s",a,b);
return ;

}

70,012

社区成员

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

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