自己实现库函数strcpy(),strlen()。

1、strcpy().
用来拷贝字符串,将第二个字符串拷贝到第一个字符串里面。
1.1 函数原型。

const char * strcpy(char* dest, const char* src); 

1.2 自定义实现。

const char * _myStrcpy(char* dest, const char* src)
{
	assert((dest != NULL) && (src != NULL));

	const char* pTemp = dest;
	while (*src != '\0')
	{
		*dest++ = *src++;
	}

	return pTemp;
}

1.3 总结。

/*
要点:
	1.源字符串参数用const修饰char* src,防止修改源字符串;
	2.两个字符串防止空指针;
	3.记录下来目标串首地址,以防指针++运算后找不到字符数组首地址。
	4.返回const chat *,构建链式表达式。
*/

2、strlen().
计算字符串有效字节长度(Byte数)。
2.1 函数原型。

_Check_return_ size_t  __cdecl strlen(_In_z_ const char * _Str);

2.2 自定义实现。

unsigned int _myStrlen(const char* src)
{
	int nLenth = 0;
	if (src == NULL)
	{
		return nLenth;
	}
	else
	{
		while (*src++ !='\0')
		{
			nLenth++;
		}
	}
	return nLenth;
}

2.3总结。

/*
1.源字符串参数用const修饰char* src,防止修改源字符串;
2、返回unsigned int;
*/
非常好!我们继续按照你的要求,**完全使用 C 风格、手搓实现**,并且: ✅ 不使用 `strlen`、`strcpy`、`strcat`、`find` 等库函数 ✅ 不使用类、构造函数、拷贝构造函数、运算符重载等 C++ 特性 ✅ 不使用 `new`、`delete` ✅ 完全手动实现字符串操作 ✅ 删除主串中首次出现的子串,并返回新串 --- ### ✅ 函数接口定义: ```c char* hstr_subtract(char* dest, const char* src, const char* sub); ``` - `src`:原始字符串 - `sub`:要删除的子串 - `dest`:输出缓冲区(用户必须保证足够大) - 如果未找到子串,输出 `"子串未找到"` 并复制原字符串到 `dest` - 返回值为 `dest` --- ### ✅ 手搓实现代码(不使用任何禁止的库函数): ```c #include <stdio.h> // 自定义字符串长度函数 int my_strlen(const char* str) { int len = 0; while (str[len] != '\0') { len++; } return len; } // 自定义字符串拷贝函数 void my_strcpy(char* dest, const char* src) { int i = 0; while (src[i] != '\0') { dest[i] = src[i]; i++; } dest[i] = '\0'; } // 自定义字符串前n个字符拷贝函数 void my_strncpy(char* dest, const char* src, int n) { int i; for (i = 0; i < n && src[i] != '\0'; i++) { dest[i] = src[i]; } for (; i < n; i++) { dest[i] = '\0'; } } // 自定义子串查找函数 int my_strstr(const char* main_str, const char* sub_str) { if (main_str == NULL || sub_str == NULL) return -1; int main_index = 0; int sub_index = 0; while (main_str[main_index] != '\0') { int i = main_index; int j = 0; while (main_str[i] != '\0' && sub_str[j] != '\0' && main_str[i] == sub_str[j]) { i++; j++; } if (sub_str[j] == '\0') { return main_index; // 找到子串 } main_index++; } return -1; // 未找到 } // 删除首次出现的子串 char* hstr_subtract(char* dest, const char* src, const char* sub) { int pos = my_strstr(src, sub); if (pos == -1) { printf("子串未找到\n"); my_strcpy(dest, src); // 拷贝原字符串 return dest; } int sub_len = my_strlen(sub); int i = 0; // 拷贝子串前部分 while (i < pos) { dest[i] = src[i]; i++; } // 跳过子串,拷贝子串后部分 int j = 0; while (src[i + sub_len] != '\0') { dest[i++] = src[i + sub_len]; } dest[i] = '\0'; return dest; } ``` --- ### ✅ 测试代码: ```c int main() { char src[] = "123456789"; char sub[] = "456"; char dest[1024]; // 输出缓冲区 hstr_subtract(dest, src, sub); printf("结果: %s\n", dest); // 输出: 123789 return 0; } ``` --- ### ✅ 说明: | 能 | 是否支持 | 说明 | |------|----------|------| | 查找子串 | ✅ 支持 | 使用手暴力匹配 | | 删除子串 | ✅ 支持 | | | 输出缓冲区 | ✅ 需要用户提供 | `dest` 必须足够大 | | 子串未找到 | ✅ 支持 | 输出提示并复制原字符串 | | C 风格实现 | ✅ 完全符合 | 没有使用类、构造函数、运算符重载等 | | 不使用库函数 | ✅ 完全手搓 | `my_strlen`, `my_strcpy`, `my_strstr` 等 | | 不使用 new/delete | ✅ 完全栈上操作 | | --- ### ✅ 优点与缺点: | 优点 | 缺点 | |------|------| | 完全 C 风格 | 未处理缓冲区溢出 | | 可移植性高 | 依赖用户传入足够大的 dest 缓冲区 | | 无依赖 | 性能不如标准库 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值