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

问题描述 投票:0回答:2

我正在尝试用 C 语言递归实现一个

strlen
函数,由于某种原因,它返回的值是预期的 4 倍。

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

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

c recursion c-strings
2个回答
7
投票

你的函数返回一个指针。在您的系统上,

int
是 4 个字节。指针算术意味着 int 指针加 1 使其值增加 4。

当您将返回值更改为

char *
时,它会“起作用”,因为
char
是 1 个字节,因此指针算术意味着向 char 指针添加 1 会将其值增加 1。

您的函数根本不需要返回 pointer,将其更改为返回

int
可以完全删除指针算术方面,从而解决问题。

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

返回比

size_t
更合适
int


1
投票
  1. strlen
    应该返回
    size_t
    而不是
    int
  2. 您返回一个指针而不是整数。
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"));
}

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

如果他们希望你返回指向整数的指针,那么也许他们想要这样奇怪的东西:

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"));
}
© www.soinside.com 2019 - 2024. All rights reserved.