用递归编写strlen函数

不用库函数,以及任意变量,编写strlen函数


int my_strlen(const char *str)

{

    assert(NULL != str);

    if('\0' == *str)

{

    return 0;

}

else

{

    return (1+my_strlen(++str) );

}

}


#include <stdio.h>
#include <assert.h>


int my_strlen(const char *str)
{
assert(NULL != str);
return ('\0' != *str)? (1+my_strlen(str+1)) : 0;

}


int main()
{
char str[100] = "12345";
printf("%d\n",my_strlen(str) );
}

### 关于 `strlen` 函数的用与实现 #### 什么是 `strlen`? `strlen` 是 C 标准库 `<string.h>` 中的一个函数,用于计算以空字符 `\0` 结尾的字符串的实际长度(不包括终止符 `\0` 的位置)。其返回值是一个无符号整数类型 `size_t`。 #### 基本语 以下是 `strlen` 的基本定义: ```c #include <string.h> size_t strlen(const char *s); ``` 参数说明: - `const char *s`: 输入的字符串指针。 返回值: - 返回输入字符串中实际字符的数量(即从起始地址到第一个遇到的 '\0' 字符之间的字节数)[^1]。 --- #### 使用示例 以下是一些常见的 `strlen` 使用场景: ##### 示例 1:简单字符串长度计算 ```c #include <stdio.h> #include <string.h> int main() { const char str[] = "Hello, world!"; size_t length = strlen(str); // 计算字符串长度 printf("The length of the string is %zu.\n", length); return 0; } ``` 运行结果: ``` The length of the string is 13. ``` 此程序通过调用 `strlen` 来获取 `"Hello, world!"` 的长度,注意该长度不包含结束符 `\0` [^2]。 --- ##### 示例 2:比较两个字符串的长度 由于 `strlen` 返回的是 `size_t` 类型,因此需要注意将其转换为有符号整数后再进行大小比较操作。 ```c #include <stdio.h> #include <string.h> int main() { if ((int)strlen("abc") - (int)strlen("abcdef") > 0) { printf(">\n"); } else { printf("<=\n"); } return 0; } ``` 运行结果: ``` <= ``` 在此例子中,`(int)` 转换是为了防止溢出或误判的情况发生 [^3]。 --- #### 自己动手实现 `strlen` 为了更好地理解 `strlen` 的工作原理,可以尝试自己编写其实现版本。以下是几种常见的方式: ##### 方 1:使用循环计数器 这是最直观的方之一,逐一遍历字符串中的每一个字符直到找到 `\0`。 ```c size_t my_strlen_counter(const char *str) { size_t count = 0; while (*str++) { ++count; } return count; } ``` ##### 方 2:利用指针差值 这种方基于指针运算来减少显式的变量增加次数。 ```c size_t my_strlen_pointer_diff(const char *str) { const char *end = str; while (*end != '\0') end++; return end - str; } ``` ##### 方 3:递归方式 虽然效率较低,但递归提供了一种优雅的方式来表达逻辑。 ```c size_t my_strlen_recursive(const char *str) { if (!*str) return 0; return 1 + my_strlen_recursive(++str); } ``` 以上三种方均能正确模拟标准库的行为,并且各有优劣之处 [^1]。 --- ### 总结 无论是在学习阶段还是项目开发过程中,掌握像 `strlen` 这样的基础工具对于提高编程能力至关重要。它不仅帮助我们处理简单的数据结构问题,还为我们提供了深入了解底层机制的机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值