C语言手动实现常用字符串函数详解

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

掌握C语言字符串函数的底层原理对于理解内存管理和指针操作至关重要。本文将深入剖析如何手动实现标准的字符串处理函数,包括使用不同策略(迭代、递归、指针算术)实现的strlen,以及涉及内存安全处理的strcat和strcmp,帮助开发者从零构建对字符串操作的深刻理解。

手动实现 strlen:计算字符串长度

strlen 用于获取字符串的有效字符数(不含结束符 '\0')。在标准库中,它通常返回 size_t 类型,但在教学实现中,常简化为 int。以下是三种常见的内部实现逻辑:

第1步:计数器版本(迭代法)

目的:通过简单的循环遍历,逐个计数直到遇到空字符。

关键点:必须包含指针非空断言,防止访问非法内存。使用 const char * 保证传入指针指向的内容不会被修改。

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

int my_strlen(const char *str)
{
	int count = 0;
	assert(str != NULL);
	while(*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

第2步:递归版本

目的:利用函数调用栈模拟迭代过程,展示递归思想在字符串遍历中的应用。

注意:递归深度受限于系统堆栈大小,对于极长字符串可能导致栈溢出,生产环境中不推荐优先使用此方法。

int my_strlen_recursive(const char *str)
{
	assert(str != NULL);
	if (*str == '\0')
		return 0;
	// 注意:前置自增 ++str 先移动指针,再传给下一层
	return (my_strlen_recursive(++str) + 1);
}

第3步:指针-指针版本(推荐)

目的:利用指针算术运算直接计算偏移量,逻辑清晰且效率较高,是许多标准库实现的变体思路。

int my_strlen_ptr_diff(const char *str)
{
  char *end = (char *)str; // 需保持类型兼容或强转
  assert(str != NULL);
  
  while (*end != '\0')
  {
   end++;
  }
  // 返回两个地址之间的差值,即字符个数
  return end - str;
}

手动实现 strcat:字符串拼接

strcat 的功能是将源字符串追加到目标字符串末尾。实现的核心在于找到目标字符串的结尾('\0'),然后逐字节复制源字符串内容,最后补上结束符。

风险提醒:strcat 要求目标缓冲区必须有足够的剩余空间,否则会导致缓冲区溢出。实际项目中应使用更安全的 strncat。

第4步:实现 strcat 拼接逻辑

入口:接收目标指针 dest 和源指针 src。

动作:

  1. 记录 dest 的起始地址,以便最后返回原指针。
  2. 移动 dest 指针直至其指向 '\0'。
  3. 执行 *dest++ = *src++ 进行字符拷贝,直到源字符串也结束。
  4. 由于循环条件本身包含了赋值和判空,最后一次赋值后 dest 会多走一步,但此时源串的空字符已覆盖目标串的空字符,无需额外补 '\0',但需确保返回的是原始 dest 地址。
#include<stdio.h>
#include<string.h>
#include<assert.h>

char *my_strcat(char *dest, const char *src)
{
	char *ret = dest; // 保存 dest 的首地址
	assert(dest && src);
	
	// 1. 找到 dest 的末尾
	while(*dest)
	{
		dest++;
	}
	
	// 2. 拷贝 src 到 dest 末尾
	// 当 *src 为 '\0' 时,赋值给 *dest 后循环终止
	while(*dest++ = *src++);
	
	// 3. 返回目标字符串起始地址
	return ret;
}

手动实现 strcmp:字符串比较

strcmp 按字典序比较两个字符串。若相等返回0,前者大返回正数,后者大返回负数。比较依据是字符的 ASCII 码值。

第5步:实现 strcmp 比较逻辑

参数:两个待比较字符串指针 str1 和 str2。

判断状态:

  • 当对应字符不相等时,返回两字符的差值(或简化为1/-1)。
  • 当同时到达 '\0' 时,说明字符串完全相同,返回0。
int my_strcmp(const char *str1, const char *str2)
{
	assert(str1 && str2);
	
	while(*str1 == *str2)
	{
		// 如果当前字符是结束符,说明前面都相等,且现在都结束了
		if(*str1 == '\0')
			return 0;
		
		str1++;
		str2++; 
	}
	
	// 退出循环说明字符不等,或者其中一个是另一个的前缀
	if(*str1 > *str2)
		return 1;
	else
		return -1;
	 // 严格标准实现通常返回 *str1 - *str2
}

总结

通过以上步骤,我们从零构建了C语言中最基础的字符串操作函数。这一过程不仅强化了对指针加减、解引用及内存布局的理解,还明确了边界条件(如NULL检查、结束符处理)的重要性。这些手写实现是理解标准库函数行为的基础,有助于在复杂场景下排查潜在Bug。

以上就是C语言手动实现字符串处理函数的详细内容,更多关于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 算法库。