关于strlen函数的模拟实现

一、strlen函数:

用来求字符串的长度的函数,且计算的是 ‘\0’ 之前的字符的个数;

如下是strlen函数的申明,size_t 表明函数返回类型为无符号整型,const char* a表示字符指针,接受字符串数组,const锁住了指针,防止*a指向的内容不小心发生改变

size_t strlen(const char *a)

二、计数器实现:

先申明下:我每个程序用到了assert()函数,这个函数叫断言,会对括号里面的表达式进行检查,出现错误会报错,指明错误在哪;对指针用,可以防止传参时传出的空指针或者野指针,使程序更严谨,需要注意的是包含头文件

#include<assert.h>;

所谓的计数器,就是设置一个变量 cunt 每确认一个字符,不为\0,则进行加一的操作;

//由计数器完成
#include<assert.h>
size_t my_strlen(const char* s1)
{
	assert(s1);//断言;
	size_t cunt = 0;
	while (*s1++)
		cunt++;
	return cunt;
}

三、指针-指针实现:

因为指针减去指针可以求出两个指针间元素个数,

### 关于 `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` 这样的基础工具对于提高编程能力至关重要。它不仅帮助我们处理简单的数据结构问题,还为我们提供了深入了解底层机制的机会。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值