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
相关产品推荐
相关产品推荐

