C语言库函数模拟实现:strcpy、strcat与strcmp详解

码头散步
码头散步
发布时间:2026-10-16| 4人浏览过
原创

C语言字符串处理是面试与开发的常见考点。本文通过手动模拟实现 strcpy、strcat 和 strcmp 三个标准库函数,深入解析指针遍历、字符赋值及ASCII值比较的核心逻辑,揭示内存安全与数据返回的关键细节。

实现strcpy:字符串拷贝的指针移动

strcpy 的核心任务是将源字符串的内容完整复制到目标缓冲区,并包含末尾的结束符 '\0'。实现时需利用两个指针进行同步遍历,确保目标地址的完整性。

第1步:参数校验与安全初始化

在进行任何指针解引用前,必须使用 assert 宏检查输入指针是否为空,防止段错误。同时记录目标数组的起始地址,以便后续返回正确的指针值。

char* my_strcpy(char* dest, char* str)
{
	// 确保目标与源指针有效,非空则继续执行
	assert(dest && str);
	// 保留首地址用于最后返回
	char* tmp = dest;
}

第2步:循环拷贝与终止符处理

通过 while 循环逐个读取源字符串字符并赋值给目标位置。循环结束后,务必手动为当前目标位置写入 '\0',以标志字符串结束。这是模拟实现中最易遗漏的步骤。

	while (*str != '\0')
	{
		*dest = *str; // 单个字符拷贝
		dest++;       // 指针后移
		str++;
	}
	*dest = '\0';    // 显式添加字符串结束符
	return tmp;      // 返回指向新字符串开头的指针
}

完整的测试用例如下:

int main()
{
	// 预分配足够空间,原内容会被覆盖
	char arr1[20] = "xxxxxxxxxxxxxxx";
	const char arr2[] = "study hard!";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

实现strcat:字符串连接的定位技巧

strcat 的功能是将源字符串追加到目标字符串的末尾。与拷贝不同,它首先需要精确定位目标字符串的尾部,随后在该位置开始进行字符复制。

第1步:定位目标尾端

使用一个指针扫描目标字符串,直到遇到 '\0' 为止。此时指针指向的就是追加操作的起始位置。这一步是连接成功的前提。

char* my_strcat(char* dest, const char* str)
{
	assert(dest && str);
	char* tmp = dest;
	
	// 寻找目标字符串的结尾(即第一个 \0)
	while (*dest != '\0')
	{
		dest++;
	}
}

第2步:连续拼接与自动结束

从目标尾部开始,将源字符串内容逐个拷贝过去。利用 *dest++ = *str++ 这种简写形式可以在赋值的同时推进指针。当源字符串被全部拷贝且包含其自身的 '\0' 后,拼接自然完成。

	// 链接字符串,直到遇到源串的结束符
	while (*dest++ = *str++)
	{
		;
	}
	*dest = '\0'; // 最终明确标记字符串结尾
	return tmp;
}

相关调用示例:

int main()
{
	char arr1[20] = "hello";
	const char arr2[] = " world!";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1); // 预期输出: hello world!
	return 0;
}

实现strcmp:基于ASCII的比较逻辑

strcmp 并非比较字符串长度,而是按照字典序逐位比较对应字符的 ASCII 码值。返回值取决于第一次出现差异的位置或两串相等的情况。

第1步:逐位同频比对

只要两个字符串当前位的字符相等,就同时向后移动指针。若在某一位发现不相等,或者两者都到达了 '\0',则跳出循环。

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0') return 0; // 完全相等时提前返回0
		str1++;
		str2++;
	}
}

第2步:计算差值判定大小

退出循环时,要么是因为字符不相等(此时需要判断谁大),要么是因为都到了尾部(此时返回0)。直接返回 *str1 - *str2 的差值:结果小于0表示前者小,大于0表示前者大。

	return *str1 - *str2; // 直接返回ASCII差值
}

测试验证:

int main()
{
	const char arr1[] = "abcdef";
	const char arr2[] = "abcder";
	int ret = my_strcmp(arr1, arr2);
	if (ret < 0) printf("<\n");
	else if (ret == 0) printf("=\n");
	else printf(">\n");
	return 0;
}

总结:

通过对这三个经典函数的模拟重写,可以清晰看到指针在解决“查找-移动-赋值”这一系列动作中的灵活应用。准确识别字符串结束符位置,并处理指针的空指针越界风险,是实现稳健C代码的基础。

以上就是C语言中strcpy、strcat、strcmp三个函数的模拟实现的详细内容,更多关于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 算法库。