模拟实现strcpy和strlen函数

本文通过两个示例展示了如何手动实现C语言中的strcpy和strlen函数。首先,详细介绍了模拟strcpy函数的过程,包括字符串复制的原理及其实现方式;其次,阐述了模拟strlen函数的步骤,演示了计算字符串长度的方法。

模拟实现strcpy函数

#include<stdio.h>
 #include<assert.h>
 void *my_strcpy(char *pdest,const char *psrc)
 
 {
 	char* ret = pdest;
 	assert(pdest != NULL);//断言
 	assert(psrc != NULL);
 	while(*pdest++ = *psrc++)//从第一个数组的第一个元素开始,把第二个数组的元素赋给第一个数组
 	{
 		;
 
 	}
 	return ret;
 	
 }
 
 int main()
 {
 	
 
 	char a[]="aaaaaaaaaaa";//定义数组
 	char *p = "hello world.";

 	printf("%s\n",my_strcpy(a,p));//输出结果
	
	return 0;
 }






二、模拟实现strlen函数

#include<stdio.h>
#include<assert.h>
int my_strlen(const char *str)
{

	int count = 0;
	
	assert(str != NULL);//断言
	while (*str != '\0')//当到‘\0’时跳出循环
	{
		count++;
		str++;
	}
	
	return count;
}
int main()
{
	char arr[]="aaaaaaaaaaa";
	int ret = my_strlen(arr);
	printf("ret=%d\n",ret);
	

	
	return 0;
}


### 实现 `strcpy_s` 的安全拷贝功能 为了实现类似于标准库中的 `strcpy_s` 功能,可以通过手动编写一个函数模拟其行为。以下是基于 C/C++ 的一种可能实现方式: #### 安全拷贝的核心逻辑 1. **输入验证**:检查目标缓冲区是否为空以及源字符串是否有效。 2. **缓冲区大小校验**:确保目标缓冲区的大小足以容纳源字符串及其终止符 `\0`。 3. **字符串复制**:逐字符复制直到遇到源字符串的结束标志 `\0`。 下面是具体实现代码: ```c #include <stdio.h> #include <string.h> // 自定义 strcpy_s 函数 errno_t custom_strcpy_s(char* dest, size_t destsz, const char* src) { // 输入有效性检查 if (dest == NULL || src == NULL || destsz == 0) { return EINVAL; // 参数无效 [^4] } // 缓冲区大小不足的情况 size_t src_len = strlen(src); if (src_len >= destsz) { return ERANGE; // 目标缓冲区太小无法容纳源字符串 } // 执行字符串复制 for (size_t i = 0; i <= src_len; ++i) { // 复制包括 '\0' dest[i] = src[i]; } return 0; // 成功执行 } int main() { char source[] = "Hello, world!"; char destination[50]; errno_t result = custom_strcopy_s(destination, sizeof(destination), source); if (result != 0) { printf("Error occurred during copying.\n"); } else { printf("Copied string: %s\n", destination); } return 0; } ``` #### 关键点解析 - 如果目标缓冲区容量小于等于源字符串长度,则返回错误码 `ERANGE` 表明缓冲区过小。 - 使用循环逐一复制字符并附加终止符 `\0` 来保证字符串的有效性[^3]。 - 错误处理机制通过返回值反映不同类型的异常情况,如非法参数或缓冲区溢出风险。 ### 注意事项 上述自定义版本仅用于学习目的,在实际开发中应优先考虑使用标准化的安全函数以获得更可靠的性能兼容性支持[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值