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