当前位置: 首页 > news >正文

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

这里写目录标题

  • 📘str
    • 💶strlen - 求字符串长度
      • 法一. count计数
      • 法二. 递归
      • 法三. 指针 - 指针
    • 💶strcpy - 字符串拷贝
    • 💶strcat - 字符串拼接
    • 💶strcmp - 比较两个字符串
    • 💶strstr - 字符串查找
  • 📗mem
    • 💵memcpy - 内存拷贝
    • 💵memmove - (重叠)内存拷贝
    • 💵memcmp - 比较

📘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;
}

相关文章:

  • 《Linux Shell脚本攻略》学习笔记-第二章
  • Python加密Excel
  • “华为杯”研究生数学建模竞赛2004年-【华为杯】C题:基于样条模型的汽车可靠性双向联合预测(附优秀论文)
  • leetcode 1814. 统计一个数组中好对子的数目
  • C语言—基于realloc函数实现的通讯录
  • CHAPTER 9 Web服务与应用(一)
  • 服务注册与发现:Nacos Discovery
  • API 网关的功能用途及实现方式
  • ElasticSearch7.10配置Search-Guard之配置用户
  • 【翻车现场】初读《编程之美》就想秀一下,结果还翻车了
  • mysql之一条mysql语句时如何执行的
  • Open3D RANSAC拟合球(Python版本)
  • 【闪电侠学netty】第2章 Netty是什么
  • 如何修复u盘损坏的文件?
  • 终于有人将Session和cookie讲明白了!一节课彻底搞懂
  • 【文件指针+文件顺序读写操作函数】
  • Java分割字符串(spilt())
  • git使用(复健 1 )
  • 2022视频编码招聘面经
  • Python爬虫 Selenium(六)