对于措辞不好的问题感到抱歉,我想不出一个更好的名字。
我正在学习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的原始空字符将被t的第一个字符替换,直到我们得到t的空字符,此时我们退出第二个循环并返回。
显然我遗漏了一些东西,因为如果没有它,代码就无法运行!!
在第一个循环之后* s指向超出'\ 0'的一个位置,但我的问题是为什么?
提前致谢:)
答案 0 :(得分:6)
首先评估*s
,然后s
递增。
因此,当到达s
的{{1}} - 终结符时,循环结束,但0
仍然会再次增加。
也没有必要这样做:
s
否则
*s--;
或
--s;
就足够了。这里无需取消引用 s--;
。
或者只是做
s
完全摆脱while (*s)
++s;
的需要。
答案 1 :(得分:2)
在检查指向的位置的值后,您增加了指针。功能上这发生在while(* s ++):
while( *s )
++s;
答案 2 :(得分:1)
将您的第一个更改为:
if (*s) {
while(*(++s)) //get to the end of s
;
}
在你的代码中,你总是会检查它是否指向'\ 0'然后递增,所以当你到达'\ 0'时你只会在下一次迭代时检查它,然后你会增加它。请注意,更改为预增量不会检查指针当前是否指向'\ 0',因此您需要在while之前检查它。
请注意,在大多数平台上,你的代码(后增量和减量后的减量)可能会更快(通常分支比减量慢),我在这个答案中的代码只是为了解你的问题。
答案 3 :(得分:0)
变量名之后的++运算符执行postincrement,这意味着它递增1,但运算符的结果是递增之前的值。如果您使用++s
,则会有所不同。
如果s为4,则在x = ++ s之后以及x = s ++之后s将为5。但是第一种情况下的结果(x的值)是5,而在第二种情况下它是4。
所以在while *s++
中,当s指向'\ 0'时,你递增它,然后取旧的,未递增的指针,取消引用它,看到\ 0,然后停止循环。 / p>
顺便说一下,你的'* s--应该是s--
,因为你不需要那个指针后面的字符。