字符串函数、内存操作函数的模拟实现

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

这里写目录标题

📘str

💶strlen - 求字符串长度

法一. count计数

size_t my_strlen(char* str)
{
	assert(str);
	unsigned int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

法二. 递归

字符串长度 = 1 + 刨去第一个字符的剩下字符串的长度
即↓

unsigned int my_strlen(char* str)
{
	assert(str);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

法三. 指针 - 指针

最后一个字符的地址’ \0 ’ 的地址- 首元素地址 = 字符串长度

unsigned int my_strlen(char* str)
{
	assert(str);
	char* start = str;
	while (*str != '\0')//或者直接写成while (*str)
	{
		str++;
	}
	return str - start;
}

💶strcpy - 字符串拷贝

char* my_strcpy(char* arr1, const char* arr2)
{
	char* sta = arr1;
	assert(arr1 && arr2);
	while (*arr1++ = *arr2++)
	{
		;
	}
	return sta;
}

PS: 其中while循环部分相当于

while (*arr)
	{
	   *arr1 = *arr2;
		 arr1++;
		 arr2++;
	}

💶strcat - 字符串拼接

char* my_strcat(char* dest, const char* source)
{
	assert(dest && source);
	char* str = dest;
	while (*dest)//不可以*dest++否则最后会多加一次
	{
		dest++;
	}
	while (*dest++ = *source++)
	{
		;
	}
	return str;
}

💶strcmp - 比较两个字符串

int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
			return 0;
		arr1++;
		arr2++;
	}
	return *arr1 - *arr2;
}

ps在VS上如果*arr1 > *arr2返回1 ; = 返回0< 返回-1
因此可以这样

if (*arr1 > *arr2)
	return 1;
else
	return -1;

💶strstr - 字符串查找

函数接口char *strstr( const char *string, const char *strCharSet );

在string中找strCharSet如果找到了返回strCharSet在string中第一次出现的位置找不到则返回空指针 NULL

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')
		return str1;

	const char* s1 = str1;
	const char* s2 = str2;
	const char* yd = str1;

	while (*yd)
	{
		s1 = yd;
		s2 = str2;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return yd;

		yd++;
	}
	return NULL;
}

📗mem

💵memcpy - 内存拷贝

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

💵memmove - 重叠内存拷贝

相当于memcpy的升级版

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

💵memcmp - 比较

int my_memcmp(const void* arr1, const void* arr2,size_t num)
{
	assert(arr1 && arr2);
	while (num--)
	{
		if (*(char*)arr1 == '\0')
			return 0;
		arr1 = (char*)arr1 + 1;
		arr2 = (char*)arr2 + 1;
	}
	return (char*)arr1 - (char*)arr2;
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6