模拟实现字符串库函数

一、长度不受限制的字符串函数

1.strcat:
(1)函数功能:实现两个字符串的连接
(2)思想:首先遍历目标字符串,找到‘\0’的地址,然后将资源字符串通过指针一次一次的拼接在目标字符串后面,直到指针走到资源字符串的‘\0’;
(3)代码:

char *Mystrcat(char *strDestination, const char *strSource)
{
    char *p = strDestination;
	assert(strDestination != NULL);
	assert(strSource != NULL);
	while (*strDestination != '\0')
	{
		strDestination++;
	}
	while (*strSource != '\0')
	{
		*strDestination = *strSource;
		strDestination++;
		strSource++;
	}
	return p;
}

2.strchr:
(1)函数功能:在字符串中寻找某字符,如果这个字符串有这个字符返回首次出现这个字符的地址,否则返回NULL;
(2)思想:通过指针遍历整个字符串寻找指定字符,找到就返回它的地址,遍历完整个字符串,仍然没有找到,则返回NULL;
(3)代码:

char *Mystrchr(const char *string, int c)
{
	char *p = string;
	assert(string != NULL);
	while (*p != '\0')
	{
		if (*p == c)
		{
			return p;
		}
		p++;
	}
	return NULL;
}

3.strstr
(1)函数功能:在目标字符串中寻找资源字符串首次出现的位置,如果找到,返回其地址,没有则返回NULL;
(2)思想:分别定义两个指针,分别指向目标字符串和资源字符串,遍历整个目标字符串,比较目标字符串和资源字符串中的元素,相等两个字符串同时往下走,不同时,目标字符串往下走,继续与资源字符串比较,直到遍历完整个目标字符串,返回NULL,或者找到资源字符串,返回其地址
(3)代码:

 char *Mystrstr(const char *string, const char *strCharSet)
    {
    	char *p = string;
    	assert(string != NULL);
    	assert(strCharSet != NULL);
    	while (*string != '\0')
    	{
    		if (*strCharSet == *string)
    		{
    			strCharSet++;
    			string++;
    			if ((*strCharSet == '\0'))
    			{
    				return p;
    			}
    			
    		}
    		else
    		{
    			p++;
    			string++;
    		}
    	}
    	return NULL; 
}

4.strcmp:
(1)函数功能:比较两个字符串大小。前者大返回1,后者大返回-1,否则返回0;
(2)思想:分别遍历两个字符串,通过指针的移动对两个字符串相应的位置进行比较
(3)代码:

int Mystrcmp(const char *string1, const char *string2)
{
	int sum2 = 0;
	int sum1 = 0;
	assert(string1 != NULL);
	assert(string2 != NULL);
	while (*string1 == *string2)
	{
		if ((*string1 == '\0') )
		{
			return 0;
		}
		string1++;
		string2++;
	}
	if (*string1 > *string2)
	{
		return 1;
	}

	{
		return -1;
	}
}

二、长度受限制的字符串函数

1.strncpy
(1)函数功能:拷贝给定个字符从资源字符串到目标字符串。
(2)思想:通过指针遍历资源字符串将指针所对应位置上的字符串赋给目标字符串的相应位置
(3)代码:

char *Mystrncpy(char *strDest, const char *strSource, size_t count)
{
	int i = 0;
	char *p = strDest;
	assert(strDest != NULL&& strSource != NULL);
	for (i = 0; i < count; i++)
	{
		*strDest = *strSource;
		strDest++;
		strSource++;
	}
	return p;
}

2.strncat
(1)函数功能:从资源字符串中取出给定个字符连接在目标字符串后面
(2)思想:通过指针遍历到目标字符串的’\0’的位置,将给定的字符一一添加在后面
(3)代码:

char *Mystrncat(char *strDest, const char *strSource, size_t count)
{
	int i = 0;
	int ret = 0;
	char *p = strDest;
	assert(strDest != NULL);
	assert(strSource != NULL);
	while (*strDest != '\0')
	{
		strDest++;
	}
	for (i = 0; i < count; i++)
	{
		*strDest++ = *strSource++;
	}
	*strDest = '\0';
	return p;
}

3.strncmp:
(1)函数功能:比较两个字符串前n个字符串的大小
(2)思想:通过给定的比较个数控制循环次数,循环内通过指针遍历所需的字符进行比较
(3)代码:

int Mystrncmp(const char *string1, const char *string2, size_t count)
{
	int i = 0;
	assert(string1 != NULL);
	assert(string2 != NULL);
	for (i = 0; i < count; i++)
	{
		if ((*string1 == *string2) && (i = count-1))
		{
			return 0;
		}
		else
		{
			break;
		}
		string1++;
		string2++;
	}
	if (*string1 > *string2)
	{
		return 1;
	}
	else
	{
		return -1;
	}
	
}

三、内存操作函数

1.memmove
(1)函数功能: 用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
(2)思想:判断指向目标字符串的指针是否大于指向资源字符串的指针,大于则进行正常的拷贝,否则,将两个指针都加上给定字节数减1在进行拷贝操作
(3)代码:

 void * Mymemmove(void * dest, const void * src, size_t count)
{
	char *p = (char *)(dest);
	char *q = (char *)src;
	void * ret = dest;
	if (dest <= src || p >= ( q + count)) {
		while (count--) {
			*p = *q;
			p++;
			q++;
		}
	}
	else {
		
		p = p +count -1;
		q = q + count -1;
		while (count--) {
			*p = *q;
			p--;
			q--;
		}
	}
	return ret;
}

2.memcpy
(1)函数功能:从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中;
(2)思想:通过指针一一将所要拷贝的部分从资源内存地址拷到目标内存地址中
(3)代码:

void *Mymemcpy(void *dest, const void *src, size_t num)
{
	char *p = (char *)(dest);
	char *q = (char *)src;
	void *ret = dest;
	while (num--)
	{
		*p = *q;
		p++;
		q++;
	}
	return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值