为什么这不指向数组中的空字符? ( '\ 0')

时间:2014-01-04 18:56:55

标签: c arrays pointers char

对于措辞不好的问题感到抱歉,我想不出一个更好的名字。

我正在学习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'的一个位置,但我的问题是为什么?

提前致谢:)

4 个答案:

答案 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--,因为你不需要那个指针后面的字符。