You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言递归计算字符串长度代码运行结果错误问题求解

我尝试使用递归方式实现字符串长度计算,所编写的代码如下:

#include <stdio.h>
int string_length(char *s, int x);

int main(void)
{
    int length = 0, x;
    char string[] = "This is a string";

    x = string_length(string, length); 
    printf("The length of the string will be: %d\n", x);
    return (0);
}

int string_length(char *c, int x)
{
    int a = 0;
    if (*c != '\0')
    {
        a = a + 1;
        string_length(c + 1, x + 1);
    }
    return (a);
}

但运行该代码后,得到如下输出结果:

The length of the string will be: 1

可以看到该输出结果并不正确,我已知测试字符串"This is a string"的实际长度为16,不清楚代码哪里编写有误。
我经过一段时间排查,猜测问题和递归函数的实现逻辑有关,请问该如何修复该问题、得到正确的字符串长度计算结果?


问题根因

递归函数的返回值逻辑存在两个核心错误:

  • 每次进入string_length函数时,局部变量a都会被重置为0,且调用string_length(c + 1, x + 1)时没有接收下层递归的返回值,所有深层递归计算出的长度结果都被直接丢弃了。
  • 传入的形参x全程没有参与实际计算,属于完全冗余的参数。

这种写法下,只要当前指针指向的字符不是结束符,函数就只会把a赋值为1后直接返回,不管递归了多少层,最外层拿到的返回值永远是1。

修复方法

递归计算字符串长度的核心逻辑非常直接:遇到字符串结束符'\0'时返回0,否则返回1 + 剩余子串的递归计算结果,不需要额外传入计数参数。
修复后的完整代码如下:

#include <stdio.h>
int string_length(char *s);

int main(void)
{
    int length;
    char string[] = "This is a string";

    length = string_length(string); 
    printf("The length of the string will be: %d\n", length);
    return 0;
}

int string_length(char *c)
{
    // 递归终止条件:到达字符串末尾返回0
    if (*c == '\0')
    {
        return 0;
    }
    // 当前字符占1位,累加后续子串的长度即为总长度
    return 1 + string_length(c + 1);
}

编译运行后即可得到正确输出:

The length of the string will be: 16

如果你想保留传入计数参数的写法,可以调整为尾递归形式,把计数结果顺着递归调用一路返回即可:

#include <stdio.h>
int string_length(char *s, int count);

int main(void)
{
    int len;
    char string[] = "This is a string";

    len = string_length(string, 0); 
    printf("The length of the string will be: %d\n", len);
    return 0;
}

int string_length(char *c, int count)
{
    if (*c == '\0')
    {
        return count;
    }
    return string_length(c + 1, count + 1);
}

内容的提问来源于stack exchange,提问作者Leuel Asfaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:57:26