char *change(char *Input,long Len)
{
char *p=Input;
int i;
for(i=0;i<Len;i++)
{
*(Input+i)=*(p+Len-1-i);
/*我的想法是将p指针从最后一个元素遍历到开头逐个传给Input的元素,实现Input的倒序。求教错在哪?*/
}
return Input;
}
void main()
{
char Input[]="hello world";
long Len=strlen("hello world");
change(Input,Len);
printf(Input);
}
嗯,我新建了个p指针指向Input,然后*(Input+i)=*(p+Len-1-i)运行,不就像把Input的备份倒一下覆盖Input吗,为什么只能覆盖一半,后面的就原样输出了。求解惑。我就想搞明白为什么不能从尾遍历到头,*(Input+i)=*(p+Len-1-i)有什么问题,谢谢
追答很简单,
最开始是hello world
做第一个循环后变成:dello world
然后再循环4次后变成:dlrow world,这个时候i的值为5,p+Len-1-i指向中间的空格
然后再循环一次的时候,没有变化,还是dlrow world
你发现没有dlrow和world以中间的空格对称,然后你再往后循环的话,后面的字符串是不会再变了,因为对称的原因,w还是会拷贝到w,o拷贝到o
能不能把change函数的*out参数去掉啊,就用*Input返回值? 还有out[i]=0是什么意思?谢谢
追答这个最好不要去。因为一个好的函数设计,输入,和输出是分开的。两者最好不要混在一起.input-输入,out存输出结果。至于out[i] = 0,数组要以'\0'结尾,0 和'\0'是等价。.
追问嗯,多谢。看了您的代码我理解下来是初始化一个指向有Len个char元素的 *out指针,然后清零操作,再用*(out+i)=*(p+Len-1-i)元素赋值,返回out。不知道说的对不对。我直接用*(p+Len-1-i)覆盖*(Input+i)为什么不行,想不通啊(都能覆盖一半),求解
追答p和input是指向同一块内存。所以这样写肯定会有问题。具体的原因楼上的已经说了。如果不太明白的话,你用VC设一个断点调试一下,然后观察一下input的每个元素的值是多少。或者用%c去打印input里的每个元素的值.
hello world 是对称的,前6个字符交换时是把 world 颠倒传给前半部分,即input 变成了dlrow world,对不对?然后,再把input 的前半部分,即前6个字符颠倒后传给后半部分,dlrow 颠倒一下变成 world 传给 后半部分 最后变成 dlrow world。
你要是觉得我回答的还行的话,给我加加分数。嘿嘿