文章目录
- 一、strlen函数简介
- 1. 函数构成
- 2. 参数说明
- 3. 使用示例
- 二、模拟实现strlen函数(从新手角度逐步升级改进)
- 1. 基础版本(利用循环计数)
- 2. 改进版本(利用指针相减)
- 3. 递归版本(利用递归思想)
一、strlen函数简介
strlen
函数是C语言标准库<string.h>
中用于计算字符串长度的一个非常常用的函数。
1. 函数构成
它的函数声明一般为:size_t strlen(const char *str);
。这里的size_t
是一种无符号整数类型(通常在不同的系统中被定义为unsigned int
或者unsigned long
等,取决于具体的编译器和平台,目的是为了能够合适地表示内存相关的大小值),用于返回字符串的长度。函数名是strlen
,参数部分是const char *str
,这表示函数接收一个指向字符常量的指针,也就是指向一个以'\0'
作为结束标志的字符串的首地址。
2. 参数说明
参数str
就是要计算长度的字符串的指针。例如,我们有一个字符串char str[] = "hello";
,当调用strlen(str)
时,就是把这个字符串str
的首地址传递给strlen
函数,让它去计算这个字符串从首字符开始到遇到'\0'
为止的字符个数(不包含'\0'
本身)。
3. 使用示例
以下是一个简单的使用strlen
函数的代码示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello world";
size_t len = strlen(str);
printf("字符串 \"%s\" 的长度是 %zu\n", str, len);
return 0;
}
在上述代码中,首先定义了一个字符串str
,然后调用strlen
函数计算其长度,并将结果存储在len
变量中,最后输出字符串以及它的长度。输出结果会是:字符串 "hello world" 的长度是 11
。
二、模拟实现strlen函数(从新手角度逐步升级改进)
1. 基础版本(利用循环计数)
对于刚接触C语言的新手来说,可能首先想到的是利用一个循环去遍历字符串,每遍历一个字符就计数一次,直到遇到字符串结束标志'\0'
为止。以下是代码实现:
#include <stdio.h>
// 模拟实现strlen函数的基础版本
size_t my_strlen_1(const char *str)
{
size_t count = 0;
while (*str!= '\0') {
count++;
str++;
}
return count;
}
int main()
{
char str[] = "hello";
size_t len = my_strlen_1(str);
printf("模拟实现的字符串 \"%s\" 的长度是 %zu\n", str, len);
return 0;
}
在这个版本中,定义了一个size_t
类型的变量count
用于计数。通过while
循环,只要当前指针所指向的字符不是'\0'
,就将count
加1,并且将指针向后移动一位(通过str++
实现),当遇到'\0'
时,循环结束,返回计数的结果也就是字符串的长度。
2. 改进版本(利用指针相减)
稍微进阶一点,我们可以利用指针相减的方式来实现。在C语言中,两个指针相减的结果是它们之间元素的个数(前提是这两个指针指向同一个数组中的元素)。
#include <stdio.h>
// 模拟实现strlen函数的改进版本(利用指针相减)
size_t my_strlen_2(const char *str)
{
const char *p = str;
while (*p!= '\0') {
p++;
}
return (size_t)(p - str);
}
int main()
{
char str[] = "hello";
size_t len = my_strlen_2(str);
printf("改进模拟实现的字符串 \"%s\" 的长度是 %zu\n", str, len);
return 0;
}
在这个版本里,首先定义了一个指针p
并让它也指向字符串的开头(和str
指向相同位置),然后通过循环让p
向后移动直到指向'\0'
,最后返回p
和str
两个指针相减的结果(注意要将结果强制转换为size_t
类型,以符合strlen
函数的返回值类型要求),这样就得到了字符串的长度。
3. 递归版本(利用递归思想)
再进一步,我们可以用递归的方式来模拟实现strlen
函数。递归的基本思路就是把一个大问题逐步分解成更小的相同类型的子问题,直到达到某个终止条件。
#include <stdio.h>
// 模拟实现strlen函数的递归版本
size_t my_strlen_3(const char *str)
{
if (*str == '\0') {
return 0;
}
return 1 + my_strlen_3(str + 1);
}
int main()
{
char str[] = "hello";
size_t len = my_strlen_3(str);
printf("递归模拟实现的字符串 \"%s\" 的长度是 %zu\n", str, len);
return 0;
}
在这个递归版本中,首先判断当前指针所指向的字符是否为'\0'
,如果是,就返回0,表示字符串长度为0了,这就是递归的终止条件。如果不是'\0'
,那就说明字符串还有长度,返回1(表示当前这个非'\0'
字符算一个长度)加上后面剩余字符串的长度(通过递归调用my_strlen_3(str + 1)
来计算,也就是把指针向后移动一位去计算剩余部分的长度),这样不断递归下去,最终就能算出整个字符串的长度。
通过这样从简单到复杂、从基础到进阶的方式,新手可以逐步深入理解strlen
函数的实现原理以及相关的编程技巧和思想。