【问题标题】:What does this piece of C code do ? [confusing with function body code]这段 C 代码有什么作用? [与函数体代码混淆]
【发布时间】:2017-10-22 04:55:48
【问题描述】:
void my_strcat(char *dest, char *src)
{
   (*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest, src): 0 ;
}

/* driver function to test above function */
int main()
{
    char dest[100] = "geeksfor";
    char *src = "geeks";
    my_strcat(dest, src);
    printf(" %s ", dest);
    getchar();
}   

我非常了解 C 主题指针和三元运算符,但对上面的代码感到困惑这是试图在条件语句中检查什么以及进一步在真假依赖语句中发生的事情。

谁能详细解释一下这段代码到底在做什么?

【问题讨论】:

  • 此函数依赖于 dest 在调用之前完全归零
  • 现在 geeksforgeeks 已经教你如何编写糟糕的 C 代码,找一个相反的教程。

标签: c arrays string function pointers


【解决方案1】:

它假定目标缓冲区char dest[100]不仅以空值结尾,而且一直填充到\0

首先,*dest 正在检查dest 指向的字符是否为空终止符, 0

如果它没有找到它,那么它递归地调用自己,但在右边一个位置,最终找到空终止符。 (如果没有空终止符,那么这个函数是危险的,写入缓冲区。)

如果它确实找到了空终止符,那么它将一个字符从源复制到目标,然后调用自身并将两个指针都向右移动,继续复制。 (同样,这似乎是在没有适当检查边界的情况下完成的。)

【讨论】:

    【解决方案2】:

    三元运算符?只是一个if-else,所以body相当于:

    if(*dest)
        my_strcat(++dest, src);
    else
        if(*dest++ = *src++)
            my_strcat(dest, src);
        else
            0;
    

    所以它会递归函数,同时假设dest 是一个以NULL 结尾的字符串,\0 直到它的结尾,这就是它测试*dest 的原因。此外,我想你现在知道这个函数的作用了。

    【讨论】:

      【解决方案3】:

      这一行:

      (*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest, src): 0 ;
      

      非常递归。

      遍历'dest'直到找到'\0'字符,然后将字符从'src'复制到'dest',如果复制的字符不是'\0',则再次调用自身(并再次并再次)直到所有字符,包括最后的 '\0' 都被复制。

      但是,我会担心最后的零,因为那不是可执行语句。建议改用return

      【讨论】:

      • 无需担心最终的0。表达式是合法的陈述。
      【解决方案4】:

      该函数将作为src 给出的字符串复制到dest 数组中给出的\0 填充位置。所以,假设你有

      char dest[100] = "geeks for\0 foo \0\0\0 bar ";
      char *src = "geeks";
      

      结果是

      geeks forg foo eek bar s
               ^     ^^^     ^ <-- geeks (src)
      ^^^^^^^^^ ^^^^^   ^^^^^  <-- geeks for\0 foo \0 bar \0\0\0... (dest)
      

      【讨论】:

        猜你喜欢
        • 2011-04-13
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多