「C语言」递归和非递归分别实现strlen

1. 前言

在C语言中,strlen是一种非常基础的字符串操作函数,用于计算字符串的长度。在本文中,我们将介绍如何使用递归和非递归两种方式实现strlen函数。

2. 非递归实现

2.1 思路

非递归实现strlen函数的思路非常简单,就是一直循环计算指针指向的字符,直到遇到字符串结束符'\0'。每遇到一个字符,就将字符串长度加1。

2.2 代码实现

size_t my_strlen(const char* str) {

size_t len = 0;

while(*str != '\0') {

len++;

str++;

}

return len;

}

上述代码中,我们使用了一个while循环,循环条件是字符串结尾处的’\0’。每遍历一次,就把长度加1。

2.3 测试

为了测试我们刚才写的非递归实现strlen函数是否正确,我们可以在一个示例代码中进行测试:

#include<stdio.h>

size_t my_strlen(const char* str);

int main() {

char str[] = "Hello, world!";

printf("%d", my_strlen(str));

return 0;

}

运行结果为:

13

可以看到,输出的结果与我们预期的一样,正确计算了字符串的长度。

3. 递归实现

3.1 思路

递归实现strlen函数的思路与非递归实现类似,不过不是使用循环结构,而是利用递归函数本身的调用特点,递归的遍历整个字符串。

3.2 代码实现

size_t my_strlen(const char* str) {

if (*str == '\0') { //递归结束条件

return 0;

} else {

return 1 + my_strlen(str + 1); //递归调用

}

}

在上述代码中,我们使用了递归方式对字符串进行遍历,遇到字符串的结束符’\0’时结束递归,返回0。否则,递归调用my_strlen函数,并对返回值进行加1,将每个字符都进行了遍历。

3.3 测试

同上面的非递归实现方案一样,为了测试递归实现的方案是否有效,我们可以使用以下代码进行测试:

#include<stdio.h>

size_t my_strlen(const char* str);

int main() {

char str[] = "Hello, world!";

printf("%d", my_strlen(str));

return 0;

}

执行上述代码,输出结果为:

13

可以看到,递归实现的方案同样可以得出正确的结果。

4. 总结

通过本文的介绍,我们了解了使用递归和非递归两种方式实现strlen函数的思路和代码实现。虽然两种方案的核心思路都是计算字符串的长度,但是递归和非递归两种方式各有特点,可以用于不同的场景。递归实现可以让代码更加简洁和优雅,但是如果递归过多,会占用过多的栈空间,这对于一些嵌入式环境等资源有限的场景会造成问题。相反,非递归实现无论字符串长度如何都不会造成过多的堆栈占用,但是代码比较“笨重”,不如递归实现来的优雅。

后端开发标签