C语言实现strlen函数的三种方法详解

Jasper
Jasper
发布时间:2026-10-16| 6人浏览过
原创

在C语言开发中,`strlen`是常用的字符串长度计算函数。本文将深入剖析该函数的底层机制,重点解析返回值类型带来的潜在陷阱,并分步演示如何利用计数器、递推逻辑及指针运算三种经典算法来独立实现该功能。

理解 strlen 函数的核心逻辑与陷阱

第1步:明确函数定义与工作前提

`strlen`的声明为 size_t strlen(const char *str)。它接收一个指向常量字符的指针,返回值为无符号整数(size_t)。其核心工作前提是:目标字符串必须以空字符 '\0' 结尾。函数统计的是从起始位置到第一个 '\0' 之前的字符个数,不包含 '\0' 本身。

若传入的字符串未正确以 '\0' 结束,函数将持续读取后续内存直至遇到随机的 '\0',导致结果不可预知。例如:

#include<stdio.h>
#include<string.h>
 
int main()
{
	// 错误示范:字符数组未显式添加 '\0'
	char str[] = { 'a', 'b', 'c' }; 
	int ret = strlen(str);
	printf("字符串的长度 = %d\n", ret); // 输出随机值
	return 0;
}

修正方案:

  • 方法一:手动添加终止符。
    char str[] = { 'a', 'b', 'c', '\0'};
  • 方法二:利用数组初始化规则。若数组大小大于初始元素个数,剩余部分默认补零(即 '\0')。
    char str[5] = { 'a', 'b', 'c'};

第2步:警惕 size_t 无符号类型的减法陷阱

size_t 是无符号整形,这在涉及长度比较或减法时极易出错。无符号数相减,若结果为负,会被解释为巨大的正整数。

常见误区代码:

if (strlen("abc") - strlen("abcdefg") > 0)
{
    printf(">\n"); // 即使直觉上长度差为-3,此处也会输出 '>'
}
else
{
    printf("<=\n");
}

由于 strlen 返回 size_t,3 - 7 的计算实际上是在无符号域进行的,产生了一个极大的正值,导致条件判断错误。

模拟实现 strlen 函数的三种策略

在自行实现 `my_strlen` 时,需遵循两个通用准则:一是使用 const 修饰指针参数以保证只读安全;二是利用 assert(str != NULL) 进行非空断言,防止访问非法内存地址。

第1步:计数法(常规遍历)

这是最直观的迭代方式。通过指针移动,每经过一个非零字符便增加计数器,直到检测到 '\0' 停止。

目的:建立基础循环逻辑。 动作:初始化 `count` 为0,当 `*str` 不为假(即不是 '\0')时,`count++` 且 `str++`。 完成状态:返回最终的 `count` 值。

#include<stdio.h>
#include<assert.h>
 
size_t my_strlen_count(const char* str)
{
	assert(str != NULL);
	int count = 0;
	while (*str) 
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char str[] = "qwerty";
	printf("Count Method Length: %d\n", my_strlen_count(str));
	return 0;
}

第2步:递归法(函数自调用)

利用函数调用的栈空间记录层级。每次递归将指针后移一位,返回值为当前层级的1加上下一层的计算结果。基线条件是遇到 '\0' 时返回0。

目的:展示递归在序列处理中的应用。 动作:若 *str 非空,返回 1 + my_strlen(str + 1)。注意:对于极长字符串,递归可能导致栈溢出。

size_t my_strlen_recursive(const char* str)
{
	assert(str != NULL);
	if (*str)
	{
		str++; // 移动到下一个字符
		return (1 + my_strlen_recursive(str));
	}
	return 0; // 遇到 '\0',结束递归
}

int main()
{
	char str[] = "qwerty";
	printf("Recursive Method Length: %d\n", my_strlen_recursive(str));
	return 0;
}

第3步:指针减指针法(内存地址运算)

C语言允许同类型指针相减,结果为单位元素的个数。我们保留初始地址,将另一个指针推进至 '\0',两者相减即为长度。

目的:利用底层指针算术优化逻辑(尽管编译器通常对前两种也有优化,但此法体现了C的精髓)。 动作:定义 const char* start = str,移动 str 至末尾,返回 str - start。

size_t my_strlen_pointer(const char* str)
{
	assert(str != NULL);
	const char* start = str; // 保存头部指针
	while (*str) 
	{
		str++; // 推进指针寻找 '\0'
	}
	return (str - start); // 计算距离
}

int main()
{
	char str[] = "qwerty";
	printf("Pointer Method Length: %d\n", my_strlen_pointer(str));
	return 0;
}

上述三种方法均能准确获取字符串长度,但在实际工程中选择取决于代码可读性需求与运行环境限制。以上就是用C语言模拟实现strlen函数的详细内容,更多关于C语言字符串处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。