我正在尝试用 C 语言递归实现一个
strlen
函数,由于某种原因,它返回的值是预期的 4 倍。
int *strlen(char *s)
{
if(*s == '\0')
return 0;
else
return 1 + strlen(s+1);
}
有趣的是,当我将函数的返回类型更改为“char”时,我得到了想要的结果。我不明白为什么,无论如何它应该返回一个 int 。这段代码是我从书上抄来的,应该是对的。
你的函数返回一个指针。在您的系统上,
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
。
strlen
应该返回 size_t
而不是 int
。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"));
}