实现strcpy、 strcat 、 strstr、 strchr 、strcmp 、memcpy 、memmove

模拟实现strlen的三种方式
//模拟实现strlen的三种方式
#include<stdio.h>
#include<assert.h>
int my_strlen1(const char * str)//计数器方式
{
	int count = 0;
	assert(str != NULL);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int my_strlen2(const char * str)//递归
{
	assert(str != NULL);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen2(str + 1);
}
int my_strlen3(char * str)//指针
{
	char *p = str;
	while (*p != '\0')
		p++;
	return p - str;
}
int main()
{
	char arr[] = "abcdef";
	int len1 = my_strlen1(arr);
	int len2 = my_strlen2(arr);
	int len3 = my_strlen3(arr);
	printf("%d\n", len1);
	printf("%d\n", len2);
	printf("%d\n", len3);
	system("pause");
	return 0;
}

模拟实现strcpy
char *my_strcpy(char *dest, const char*src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

模拟实现strcat

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

模拟实现strstr

char *my_strstr(const char*str,const char * substr)
{
	const char *s1;
	const char *s2;
	const char *cur = str;
	assert(str != NULL);
	assert(substr != NULL);
	if (*substr == '\0')
		return (char*)str;
	while (*cur)
	{
		s1 = cur;
		s2 = substr;
		while (*s1&&*s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)str;
		}
		cur++;
	}
	return NULL;
}
int main()
{
	const char *p = "abcdef";
	char *ret = my_strstr(p, "def");
	if (ret == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	system("pause");
	return 0;
}

模拟实现strchr

char *my_strchr(const char *dest, const char c)
{
	assert(dest!=NULL);
	while (*dest)
	{
		if (*dest == c)
		{
			return dest;
		}
		dest++;
	}
	return NULL;
}
int main()
{
	const char *p = "abcdef";
	char *ret = my_strchr(p, "d");
	if (ret == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	system("pause");
	return 0;
}

模拟实现strcmp
 
 
int my_strcmp(char* src, const char* dest)
{
	while (*src = *dest)
	{
		if (*src == '\0')
		{
			return 0;
		}
		src++;
		dest++;
	}
	return *src - *dest;
}
 int main()
 {
 	const char *p = "abqdef";
 	const char *q = "abbbbbbbb";
 	int ret = my_strcmp(p, q);
 	if(ret >0)
 	{
 		printf("p>q\n");
 	}
 	else if(ret <0)
 	{
 		printf("p<q\n");
 	}
 	else
 	{
 		printf("p==q\n");
 	}
 	return 0;
 }
 

模拟实现memcpy
void * my_memcpy(void *dest,void *src,int count)
{
	void *ret = dest;
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

模拟实现memmove

void* my_memmove(void *dest, const void*src, size_t count)
{
	void *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	if (dest<src)
	{
		//前->后
		while(count--)
		{
			*(char *)dest = *(char*)src;
		 	dest = (char *)dest+1;
			src = (char*)src+1;
		}
 	}
	else
	 	{
		//后->前
		while(count--)
		{
 			*((char *)dest+count) = *((char*)src+count);
		}
	}
	return ret;
}
int main()
{
	int arr1[10] = {0};
	int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	my_memcpy(arr2, arr1, 20);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_41268108/article/details/80420412
今日推荐