exercise19

1.实现strcpy
2.实现strcat
3.实现strstr
4.实现strchr
5.实现strcmp
6.实现memcpy
7.实现memmove

#include<stdio.h>
#include<assert.h>

#define LEN 20
//1.实现strcpy
char *my_strcpy(char *dst, const char *str)//str内容不会修改
{
	assert(str);
	assert(dst);
	char *ret = dst;
	while (*dst = *str)//'\0'
	{
		dst++, str++;
	}
	return ret;
}
//2.实现strcat
char *my_strcat(char *dst, const char *str)
{
	assert(dst);
	assert(str);
	char *ret = dst;
	while (*dst)//n内容‘\0'
	{
		dst++;
	}
	while (*dst = *str)
	{
		dst++; str++;
	}
	return ret;
}
//3.实现strstr
//char *strstr(const char *string,const char * strCharSet)
char *my_strstr(const char *str, const char *dst)
{
	assert(str);
	assert(dst);
	char *p = NULL;
	char *np = NULL;
	char *q = NULL;
	p = str;

	while (*p)//保证p不越界
	{
		q = dst;//q回到子串起始位置
		np = p;//np回到p的位置
		while (*np && *q && (*np == *q))//np,q不为空且相等的时候;说明找到一样的字符
		{
			np++, q++;
		}
		//走到这步说明三条件中任一不满足循环退出
		if (*q == 0)//第1种原因退出循环;子串找到了
		{
			return p;
		}
		if (*np == 0)//第2种原因退出循环;走到这步说明 q肯定没找完,但是np已经找完,所以没找到子串
		{
			break;
		}
		p++;//第3种原因退出循环;q,np都没找完;但是np不等于q;所以p继续从下一个字符查起;q回到起始;
	}
	return NULL;
}
//4.实现strchr
char *my_strchr( char *src, char c)
{
	char *ret = src;
	while (*src && *src != c)
		src++;
	if (*src == c)
		return src;
	return NULL;
}
//5.实现strcmp
int my_strcmp(const char *src, const char *dst)
{
	int ret = 0;
	while (!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)//检测相等;取反!==1
	{
		src++, dst++;
	}
	if (ret < 0)
	{
		ret = -1;
	}
	else if (ret>0)
	{
		ret = 1;
	}
	return ret;
}
//6.实现memcpy
void *memcpy(void *dst,const void *src,size_t num)//任意类型
{
	void *ret = dst;
	while (num--)
	{
		*(char *)dst = *(char *)src;
		dst = (char *)dst + 1;//'\0'
		src = (char *)src + 1;
	}
	return ret;
}
//7.实现memmove;比memcpy对考虑了内存重叠问题
void *memmove(void *dst, const void *src, size_t num)
{
	void *ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + num))
	{
		while (num--)
		{
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else
	{
		dst = (char *)dst + num - 1;//-1指向最后一个元素
		src = (char *)src + num - 1;
		while (num--)
		{
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}
	return ret;
}
int main()
{
	/*char *str = "abcdfr";
	char dst[LEN] = { 0 };
	my_strcpy(dst, str);
	printf("%s\n", dst);*/

	/*char str[LEN] = "absdef";
	char dst[LEN] = "1234";
	my_strcat(dst,str);
	printf("%s\n",dst);*/

	/*char *str = "abdefhefghih";
	char *dst = "efgh";
	printf("%s\n", my_strstr(str, dst));*/

	/*char src[20] = "abcdef!";
	char c = 'e';
	char *ret = my_strchr(src, c);
    printf("%s\n", ret);*/

	/*char *src = "abcdefg";
	char *dst = "abcd ";
	my_strcmp(src, dst);
	printf("%d\n", my_strcmp(src, dst));*/

	/*char *src = "abcdefgh";
	char dst[LEN] = { 0 };
	int num = LEN;
	memcpy(dst,src,num);
	printf("%s\n", dst);*/

	char *src = "abcdefgh";
	char dst[LEN] = { "a"};
	int num = LEN;
	memmove(dst+1, src, num);
	printf("%s\n", dst); 

	system("pause");
	return 0;
}







猜你喜欢

转载自blog.csdn.net/zn_wuxunian/article/details/80445539
今日推荐