模拟实现strcpy,strcmpy等字符串操作函数

本文详细介绍了如何手动模拟实现C语言中的几个经典字符串操作函数,包括strcpy用于复制字符串,strcmp用于比较字符串,strcat用于连接字符串,strncat用于有限长度的字符串连接,以及memcpy用于内存块的复制。通过这些模拟实现,读者可以深入理解这些函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟实现常见字符串操作函数


1. strcpy

函数名说明
函数原型char *strcpy(char* dest, const char *src)
参数说明dest 为指向用于存储复制内容的目标数组,src 为要复制的字符串
头文件stdio.h
描述把 src 所指向的字符串复制到 dest。
返回值该函数返回一个指向最终的目标字符串 dest 的指针
注意如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况

模拟实现

// 模拟实现 strcpy
#include<iostream>
#include<assert.h>
using namespace std;
char* my_strcpy(char * dst, char const* src) 
{
	assert(dst); 
	assert(src);
	char* ret = dst;
	while (*dst++ = *src++);
	return ret;
}

int main()
{
	
	/*
	char* ch1 = "acc";
	char* ch2 = "acc";
	*/
	//注意这里要用数组,字符串常量区不可写
	char ch1[10] = "123456798";
	char ch2[] = "abc";
	
	cout << my_strcpy(ch1, ch2) << endl;
	system("pause");
	return 0;
}

2.strcmp

函数名说明
函数原型int strcmp(const char *str1, const char *str2)
参数说明str1,str2 为要进行比较的两个字符串
头文件string.h
描述用于比较两个字符串 ,并根据比较结果返回整数
返回值按照ASCII比较,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数

模拟实现

// 模拟实现 strcmp
#include<iostream>
#include<assert.h>
using namespace std;
int my_strcmp(char const* dst, char const* src) 
{
assert(dst); 
assert(src);
while (*dst == *src && *dst != '\0')
{
	dst++;
	src++;
}
	return *dst-*src;
}

int main()
{
	char* ch1 = "acc";
	char* ch2 = "acd";
	cout << my_strcmp(ch1, ch2) << endl;
	system("pause");
	return 0;
}

3.strcat

函数名说明
函数原型extern char *strcat(char *dest, const char *src)
参数说明dest指向目标字符串,src为指向源字符串
头文件C语言中string.h / C++中cstring
描述把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
返回值返回指向dest的指针
注意目标字符串要足够容纳追加后的字符串

模拟实现

// 模拟实现 strcat
#include<iostream>
#include<assert.h>
using namespace std;
char* my_strcat(char* dst, char const* src) 
{
	assert(dst); 
	assert(src);
	char* ret = dst;
	while (*ret!='\0')
	ret++;

	while (*ret++ = *src++);
	return dst;
}

int main()
{
	char ch1[10] = "acc";
	char ch2[10] = "123";
	cout << my_strcat(ch1, ch2) << endl;
	system("pause");
	return 0;
}

4.strncat

函数名说明
函数原型char * strncat(char *dest, const char *src, size_t n)
参数说明dest指向目标字符串,src为指向源字符串
头文件string.h
描述把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的’\0’
返回值返回指向dest的指针

模拟实现

// 模拟实现 strncat
#include<iostream>
#include<assert.h>
using namespace std;
char* my_strncat(char* dst, char const* src, int n)
{
	assert(dst);
	assert(src);
	char* ret = dst;
	while (*ret != '\0')
		ret++;

	while (n--)
	{
		*ret++=*src++;
	}
	*ret = '\0';
	return dst;
}

int main()
{
	char ch1[10] = "acc";
	char ch2[10] = "123";
	cout << my_strncat(ch1, ch2,4) << endl;
	system("pause");
	return;
}

5.memcpy

函数名说明
函数原型void *memcpy(void *des, void *src, unsigned n);
参数说明des指向目标内存,类型强制转换为 void* 指针。source 指向要复制的数据源,类型强制转换为 void* 指针。n为 要被复制的字节数。
头文件C语言中string.h / C++中cstring
描述从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中
返回值返回指向des的指针

模拟实现

// 模拟实现 memcpy
#include<iostream>
#include<assert.h>
using namespace std;
char* my_memcpy(char* dst, const char* src)
{
	char* ret = dst;
	assert(dst);
	assert(src);
	while (*dst++ = *src++);
	return ret;
}

int main()
{
	char ch1[12] = " ";
	my_memcpy(ch1, "hello");
	cout << ch1 << endl;

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值