字符串函数和内存函数的复现 strcat,strcmp,strcpy,strlen,strncpy,strncat,strstr,memcpy

目录

一:strcat

 思路

 代码

二:strcmp

 图解

代码

三:strcpy

思路

代码

四:strlen

思路

代码

五:strncpy

思路

代码

六:strncat

思路

代码

7:strstr

思路

图解

代码

8:memcpy

思路

代码


一:strcat

 思路

●找到目标空间的\0

●追加源字符串至\0

●目标空间一定要够大

 代码

//strcat函数的返回值是起始空间的地址
char* my_strcat(char* dest, const char* scr) {//const防止字符串scr的内容被意外修改
	assert(dest && scr);//断言
	char* str = *dest;//将起始空间的地址存起来
	//1.找到目标字符串的\0
	while (*dest) {
		dest++;
	}
	//2.追加源字符串至\0
	while (*dest++ = *scr++) {//相当于strcpy
		;
	}
	return str;
}

二:strcmp

 

 图解

代码

//模拟实现strcmp
int my_strcmp(char* s1, char* s2) {
	while (*s1 == *s2) {//一个字符一个比较,直到不相等
		if (s1 == '\0')//如果s1为\0,那么s2也为\0,此时已经比较完成,返回
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;//不相同,返回两个字符的差值
}

三:strcpy

思路

●这个很简单,把源空间的字符包括\0都存放在目标空间中,返回值是目标空间的起始地址

代码

//模拟实现strcpy
//返回的是目标空间的起始地址
char* my_strcpy(char* str, const char* str2) {
	char* p = str;
	assert(str && str2);//断言判断两个字符串是否为空
	while (*str++ = *str2++) {//将str2中的字符赋给str中,包括/0
		;
	}
	return p;
}

四:strlen

思路

●这个也很简单,只需计算出\0之前的字符个数即可,返回值是整形

代码

//模拟实现strlen
my_strlen(char* p) {
	assert(p);
	int count = 0;
	while (*p++) {//计算\0之前的字符个数
		count++;
	}
	return count;
}

五:strncpy

思路

●这个是长度受限制的字符串函数

●里面有3个参数,分别是目标空间,源空间和要复制的字符个数,当赋值的字符个数多于源空间的时候会在后面补零

代码

//模拟实现strncpy
//strncpy 返回的是目标空间的起始地址
char* my_strncpy(char* arr, char* arr2,int n) {
	assert(arr && arr2);
	char* str = arr;//存储起始地址
	int count = 0;//记录复制字符串的个数
	while (n--) {
	
		count++;
		if (count > strlen(arr2) && count <= n) {//当复制的个数超过了目标空间字符串的个数的时候
			//并且小于要复制的字符个数的时候补\0
			*arr = '\0';
		}
		else {
			*arr++ = *arr2++;

		}
		
	}
	return str;
}

六:strncat

思路

●这个和strcat比较相似,唯一区别就是多了一个追加几个字符给目标空间的参数

●当参数大于源空间的字符个数时,参数就等于源空间的字符个数

代码

//模拟实现strncat
//返回的是目标空间的起始地址
char* my_strncat(char*arr, char*arr2,int n) {
	assert(arr && arr2);
	char* str1 = arr;
	//目标空间找到\0
	while (*arr) {
		arr++;
	}
	if (n > strlen(arr2)) {//判断字符是否超限
		n = strlen(arr2);
	}
    //将源空间的有限个字符赋给目标空间
	int count = 0;
	while ( count++<n) {
		*arr++ = *arr2++;
		
	}
	return str1;
}

7:strstr

思路

●本质就是在目标字符串中查找与源字符串相等的字串

●需要3个指针,两个指向目标字符串,一个指向源字符串,指向目标字符串的指针有一个是用来重新在不符合源字符串的内容的下一个字符开始查找(就是用来回退指针的)

图解

代码

char *my_strstr(const char* str1, const char* str2) {//const防止原数组被修改
	assert(str1 && str2);//断言
	char *p1;//创建3个指针一个指向str2,一个指向str1,另外一个也指向str1,但是是用来返回到
	char *p2;
	char *pc = str1;//pc是用来返回的
	while (*pc) {
		p1 = pc;//pc的内容给p1
		p2 = str2;
		while (*p1!='\0' && *p2!='\0' && *p2 == *p1) {//如果不相等,或者str2已经到了\0,或者str1不够长
			//都不进入while循环
			p2++;
			p1++;
		}
		if (*p2 == '\0') {//说明str2已经到达了\0,此时str2是str1的字串,返回str2中pc指针的地址
			return pc;
		}else{//否则指针pc后移
			pc++;

		}	
	}
	return NULL;
}

8:memcpy

 

思路

●和strcpy类似,但是这个可以对任意类型的数据进行拷贝,因此指针类型为void*

●由于void*是万能指针,可以接收任意类型的指针,但是不能够运算,因此考虑强制力类型转换

代码

void* my_memcpy(void* str1, const void* str2, size_t count) {
	void* p = str1;
	while (count--) {
		*(char*)str1 = *(char*)str2;//一个字节一个字节的拷贝
		//str2++;//由于str1与str2是void* 型的不能够进行运算
		//str1++;
		str1 = (char*)str1 + 1;//强制转换后可以进行运算,void*可以接受任意类型的指针
		str2 = (char*)str2 + 1;
	}
	return p;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值