首页 文章

为什么不't this pointing to the null character in array? (' \ 0')

提问于
浏览
1

抱歉措辞不好的问题,我想不出更好的名字 .

我正在学习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 回答

  • 2

    首先评估 *s ,然后递增 s .

    因此当到达 s0 -terminator时,循环结束,但 s 仍然再次增加 .


    也没有必要这样做:

    *s--;
    

    --s;
    

    要么

    s--;
    

    就足够了 . 这里没有必要去引用 s .

    或者干脆做

    while (*s)
      ++s;
    

    完全摆脱 --s; 的需要 .

  • 0

    在检查指向的位置的值后,您增加了指针 . 功能上这发生在while(* s):

    while( *s )
    ++s;
    
  • 1

    改变你的第一个到:

    if (*s) {
        while(*(++s))                //get to the end of s
                ;
    }
    

    在你的代码中,你总是会检查它是否指向'\ 0'然后递增,所以当你到达'\ 0'时你只会在下一次迭代时检查它,然后你会增加它 . 请注意,更改为预增量不会检查指针当前是否指向'\ 0',因此您需要在while之前检查它 .

    请注意,在大多数平台上,您的代码(后增量和减少后的减量)可能会更快(通常分支比减量慢),本答案中的代码仅供您理解 .

  • 6

    变量名后的运算符执行后递增,这意味着它递增1,但运算符的结果是递增前的值 . 如果您使用 ++s ,则会有所不同 .

    如果s是4,那么在x = s之后以及x = s之后s将是5 . 但是第一种情况下的结果(x的值)是5,而在第二种情况下它是4 .

    所以在你的 while *s++ 中,当s指向'\0'时,你递增它,然后取旧的,未递增的指针,取消引用它,看到\ 0,然后停止循环 .

    顺便说一句,你的'*s--'应该是 s-- ,因为你在那里的指针后面没有't need the character ' .

相关问题