繁体   English   中英

为什么我的递归 strlen function 返回值大 4 倍?

[英]Why does my recursive strlen function return value 4 times bigger?

我正在尝试通过递归在 C 中实现strlen function,由于某种原因,它返回的值是预期的 4 倍。

int *strlen(char *s)
{
   if(*s == '\0')
       return 0;
   else
       return 1 + strlen(s+1);
}

有趣的是,当我将 function 的返回类型更改为“char”时,我得到了想要的结果。 我不明白为什么,无论如何它应该返回一个 int。 这段代码是我从书上抄来的,应该是对的。

您的 function 返回一个指针。 在您的系统上,一个int是 4 个字节。 指针算术意味着将 1 加到 int 指针会使它的值增加 4。当您将返回值更改为char *它“有效”,因为char是 1 个字节,所以指针算术意味着将 1 加到 char 指针会增加它的值1.

您的 function 根本不需要返回指针

int strlen(char *s)
{
  if (*s == '\0')
      return 0;
  else
      return 1 + strlen(s+1);
}

让它返回size_tint更合适。

  1. strlen应该返回size_t而不是int
  2. 您返回一个指针而不是 integer。
size_t mystrlen(const char *str)
{
    return *str ? 1 + mystrlen(str + 1) : 0;
}

int main(int argc, const char *argv[])
{
    printf("%zu\n", mystrlen("Hello"));
}

这段代码是从书上抄来的,应该是对的

如果他们想让你返回指向 integer 的指针,那么他们可能想要这样的奇怪东西:

int *mystrlen(const char *str)
{
    static int first = 1;
    static int size = 0;
    if(first) {size = 0; first = 0;}

    if(*str)
    {
        size++;
        mystrlen(str + 1);
    }
    else
    {
        first = 1;
    }
    return &size;
}

int main(int argc, const char *argv[])
{
    printf("%d\n", *mystrlen("Hello"));
    printf("%d\n", *mystrlen(" World"));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM