c语言实现strstr、strchr、strcmp、memcpy、memmove

1.实现strstr函数。strstr函数的功能是在字符串1中寻找是否含有字符串2,也就是查看字符串2是否位字符串1的字串。

实现方法相对简单,可以先遍历字符串1,找到与字符串2的首位置相同的字符,然后在从该处开始依次比较接下来的字符是否相等,直到字符串2结束为止。因此在这里可以用到一个二重循环,第一重循环遍历字符串1,第二重循环从两个字符串有相同字符开始,如果二重循环结束,并且字符串2都被比较完了,就说明字符串2是字符串1的字串,下面是实现代码:

//1.实现strstr
char* Strstr(char* arr1, char* arr2)
{
	assert(arr1);
	assert(arr2);
	char* temp1 = arr1;
	char* temp2 = arr2;
	while (*temp1)
	{
		char* ret = temp1;
		while (*temp1 == *temp2 && temp1 != NULL)
		{
			temp1++;
			temp2++;
		}
		if (!*temp2)
		{
			return ret;
		}
		if (!*temp1)
		{
			return NULL;
		}
        temp1++;
	}
	return NULL;
}

2.实现strchr函数。strchr函数是在字符串里查找某个字符,如果找到了该字符,并且是字符串里第一个该字符,则返回该字符出现位置的指针。实现方法很简单,只需要将字符串一次遍历就可以了,下面为实现代码:

//2.实现strchr
char* Strchr(char* arr1, char c)
{
	char* ret = NULL;
	while (*arr1)
	{
		if (*arr1 == c)
		{
			ret = arr1;
			return ret;
		}
		arr1++;
	}
	return NULL;
}

3.实现strcmp函数。strcmp函数的功能是将两个字符串按字典序比较大小。实现方法依旧可以使用两个字符串依次遍历的方式

//3.实现strcmp
int Strcmp(char* arr1, char* arr2)
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	int minlen = (len1 < len2 ? len1 : len2);
	int i = 0;
	for (i = 0; i < minlen; i++)
	{
		if (arr1[i]>arr2[i])
		{
			return 1;
		}
		else if (arr1[i] < arr2[i])
		{
			return -1;
		}
		else
			continue;
	}
	if (i == minlen && len1<len2)
	{
		return -1;
	}
	if (len1 == len2 && i ==  minlen)
	{
		return 0;
	}	
	if (len1 > len2 && i == minlen)
	{
		return 1;
	}

}

4.实现memcpy函数。memcpy函数功能是由源字符串指针arr1指向地址为起始地址的连续n个字节的数据复制到以目标指针arr2指向地址为起始地址的空间内.。实现方法也很简单,直接看代码吧:

//4.实现memcpy
char* Memcpy(char* arr2, char* arr1, int k)
{
	assert(arr1);
	assert(arr2);
	char* ret = arr2;
	while (k > 0)
	{
		*arr2++ = *arr1++;
		k--;
	}
	return ret;
}

5.实现memmove函数。memmove函数功能类似于memcpy函数,但是如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域区域的字节拷贝到目标区域中,但复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。实现代码如下:

//5.实现memmove
char* Memmove(char* arr2,char* arr1,int k)
{
	assert(arr1&&arr2);
	char *p1 = (char *)arr1;
	char *p2 = (char *)arr2;
	if (p1 < p2)
	{
		while (k--)
		{
			*p1 = *p2;
			p1++;
			p2++;
		}
	}
	else
	{
		p1 = p1 + k - 1;
		p2 = p2 + k - 1;
		while (n--)
		{
			*p1 = *p2;
			p1--;
			p2--;
		}
	}
	return arr1;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值