抱歉措辞不好的问题,我想不出更好的名字 .
我正在学习C,刚刚转到指针并编写了一个函数strcat(char * s,char * t),它将t添加到s的结尾:
void strcat(char *s, char *t) //add t to the end of s
{
while(*s++) //get to the end of s
;
*s--; //unsure why I need this
while(*s++ = *t++) //copy t to the end of s
;
return;
}
现在我的问题是为什么我需要这条线:
*s--;
当我最初添加它时,我认为直到我完成代码才有意义 .
我会认为以下情况属实:
1)第一个循环连续递增,当* s为0(或空字符)时,它继续前进,所以现在* s指向数组的空字符 .
2)所以我应该做的就是实现第二个循环 . s的原始null字符将被t的第一个字符替换,直到我们得到t的null字符,此时我们退出第二个循环并返回 .
很明显我错过了一些东西,因为代码没有它就行不通!!
在第一个循环* s指向超出'\ 0'的一个位置之后但我的问题是为什么?
提前致谢 :)
4 回答
首先评估
*s
,然后递增s
.因此当到达
s
的0
-terminator时,循环结束,但s
仍然再次增加 .也没有必要这样做:
干
要么
就足够了 . 这里没有必要去引用
s
.或者干脆做
完全摆脱
--s;
的需要 .在检查指向的位置的值后,您增加了指针 . 功能上这发生在while(* s):
改变你的第一个到:
在你的代码中,你总是会检查它是否指向'\ 0'然后递增,所以当你到达'\ 0'时你只会在下一次迭代时检查它,然后你会增加它 . 请注意,更改为预增量不会检查指针当前是否指向'\ 0',因此您需要在while之前检查它 .
请注意,在大多数平台上,您的代码(后增量和减少后的减量)可能会更快(通常分支比减量慢),本答案中的代码仅供您理解 .
变量名后的运算符执行后递增,这意味着它递增1,但运算符的结果是递增前的值 . 如果您使用
++s
,则会有所不同 .如果s是4,那么在x = s之后以及x = s之后s将是5 . 但是第一种情况下的结果(x的值)是5,而在第二种情况下它是4 .
所以在你的
while *s++
中,当s指向'\0'时,你递增它,然后取旧的,未递增的指针,取消引用它,看到\ 0,然后停止循环 .顺便说一句,你的'*s--'应该是
s--
,因为你在那里的指针后面没有't need the character ' .