模拟实现字符串拷贝,比较等函数

1.模拟实现strcpy

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

2.模拟实现strncpy

char* my_strncpy(char* dst,const char* src,int n)
{
    assert(dst!=NULL);
    assert(src!=NULL);
    char* ret=dst;
    while(n)
    {
       *dst=*src;
       dst++;
       src++;
       n--;
    }
    if(*(dst-1)!='\0')
    {
       *dst='\0';
    }
    return ret;
}

3.模拟实现strcat

char *my_strcat(char* dst, char* src)
{
	assert(dst != NULL);
	assert(src != NULL);
	char *ret = dst;
	while (*dst)
	{
		dst++;
	}
	while (*dst = *src)
	{
		dst++, src++;
	}
	return ret;
}

 

4.模拟实现strncat

char *my_strncat(char* dst, const char *src, int n)
{
	assert(dst != NULL);
	assert(src != NULL);
	char *ret = dst;
	while (*dst)//将dst的指针移到‘\0'处
	{
		dst++;
	}
	while (n)
	{
		*dst = *src;
		dst++, src++;
		n--;
	}
	if (*(dst - 1) != '\0')
	{
		*dst = '\0';
	}
	return ret;
}

 

 

5.模拟实现strncmp

int my_strncmp(const char *src, const char *dst, int n)
{
	assert(src != NULL);
	assert(dst != NULL);
	int ret = 0;
	while (n)
	{
		ret = *(unsigned char*)src - *(unsigned char*)dst;
		src++, dst++;
		n--;
		if (ret < 0)
		{
			ret = -1;
		}
		else if (ret>0)
		{
			ret = 1;
		}
		else{
			ret = 0;
		}
	}
	
	return ret;

}

6.模拟实现strcmp

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 != NULL);
	assert(s2 != NULL);
	int res = 0;
	int ret=0;
	while (!(ret = *(unsigned char*)s1 - *(unsigned char*)s2) && *s1)
	{
		s1++, s2++;
	}
	if (ret < 0)
	{
		res = -1;
	}
	else if (ret>0)
	{
		res = 1;
	}
	else{
		res = 0;
	}
	return(res);
}

6.模拟实现strncmp

int my_strncmp(const char *src, const char *dst, int n)
{
	assert(src != NULL);
	assert(dst != NULL);
	int ret = 0;
	while (n)
	{
		ret = *(unsigned char*)src - *(unsigned char*)dst;
		src++, dst++;
		n--;
		if (ret < 0)
		{
			ret = -1;
		}
		else if (ret>0)
		{
			ret = 1;
		}
		else{
			ret = 0;
		}
	}
	
	return ret;

}

7.模拟实现strstr

char *my_strstr(char*str, char*sub_str)
{
	assert(str);
	assert(sub_str);
	char *p = NULL;
	char *np = NULL;
	char *q = NULL;
	p = str;
	while (*p)
	{
		np = p;//np始终在p的前面
		q = sub_str;
		for (; *np&&*q&&*np == *q; np++, q++)//指针np和指针q都不能为空,且np指的内容和q的内容相等
		{
			;
		}
		if (*q == '\0')//说明已经找到
		{
			return p;
		}
		else if (*np == '\0')//q还没找完,p已经找完,就没必要再找了
		{
			break;
		}
		else{     //走到这儿说明p没到'\0',q也没到'\0',只能是*np!=*q;
			p++;
		}
	}
	return NULL;
}

8.模拟实现memcpy(内存拷贝)

void *my_memcpy(void *dst, const void *src, int num)
{
	assert(dst);
	assert(src);
	char *_dst = (char *)dst;
	const char *_src = (const char *)src;
	while (num--)
	{
		*_dst = *_src;
		_dst++, _src++;
	}
	return dst;
}

9.模拟实现memmove(从src拷贝num个字节到dst)

void *my_memmove(void *dst, const void *src, int num)
{
	assert(dst);
	assert(src);
	char *_d = (char*)dst;
    char *_s = (char*)src;
	if (_d > _s&&_d < _s + num)  //从右往左拷贝
	{
		*_d += num;
		*_s += num;
		while (num--)
		{
			*_d = *_s;
			_d--, _s--;
		}
		
	}
	else
	{
		while (num--)
		{
			*_d = *_s;
			_d++, _s++;
		}
	}
	return dst;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值