字符串各种库函数的实现(strlen,strcpy,strcmp,strcat,strstr,memcpy)

  • strlen的实现

有很多种方法这里用的为指针相减

int my_strlen(const char* str) {
	assert(str != NULL);
	char* p=str;
	while (*p) {
		p++;
	}
	return p - str;
}
  • strcpy的实现

char* my_strcpy(const char* src, char* dst) {
	assert(src != NULL);
	assert(dst != NULL);
	char* ret = dst;
	while (*dst++ = *src++);
	return ret;
}
  • strcmp的实现

前者大于后者返回值为1,后者大于前者返回-1,相等返回0。

int my_strcmp(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	int ret = 0;
	const unsigned char* s1 = (const unsigned char*)str1;
	const unsigned char* s2 = (const unsigned char*)str2;
	while (!(ret = *s1 - *s2) && *s1)
		s1++, s2++;
	if (ret > 0) {
		return 1;
	}
	else if (ret < 0) {
		return -1;
	}
	else
		return 0;
}
  • strcat的实现

把src的内容拼接到dst原内容后面

char* my_strcat(char* dst, const char* src) {
	assert(dst != NULL);
	assert(src != NULL);
	char* ret = dst;
	while (*dst) {
		dst++;
	}
	while (*dst++ = *src++);
	return ret;
}
  • strstr的实现

定义了多个指针,str1为目标字符串,str2为子串,s1用来保存str1,s2用来保存str2,move用来往后指和str2比较

char* my_strstr(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	const char* s1 = str1; 
	const char* s2 = str2;
	const char* move=NULL;
	if (!*str2) {
		return s1;
	}
	while (*s1) {
		str2 = s2;
		move = s1;
		while (*str2 && *move && *str2++ == *move++) {
			if (!*str2) { 
				return s1;
			}
		}
		s1++;
		
	}
	return NULL;
}
  • memcpy的实现

注意指针定义的类型,这里实现不了内存重叠的问题。

void* my_memcpy(void* dst, const void* src, size_t count) {
	assert(dst != NULL);
	assert(src != NULL);
	void* ret = dst;
	if (!count) {
		return dst;
	}
	unsigned char* _dst =(unsigned char*) dst;
	unsigned char* _src = (unsigned char*)src;
	while (count--) {
		*_dst++ = *_src++;
	}
	return ret;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿拉蕾wjh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值