(简化版)字符串函数模拟实现

前言

之前我们学习了详解字符串函数的使用,里面详细的介绍了各个字符串函数的使用,以及这些字符串函数是怎么实现的,里面都介绍的非常的详细,现在我们这个简化版的字符串函数主要内容是模拟这些字符串函数的模拟实现,也就是说没有详细的介绍这些字符串函数是怎么实现的。所以这期博客的主要目的就是复习一下这些字符串函数的模拟实现,如果有不明白的小伙伴们可以去我之前写到详解字符串函数的使用看看,这里里面详细的介绍了这些字符串函数的模拟实现,好了接下来我们就进入整体

1.strlen

1:计数器

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	assert(str!=NULL);
	int count=0;
	while(*str!='\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[]="helloworld";
	int ret=my_strlen(arr);
	printf("%d\n",ret);
	return 0;
}

2.递归

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	assert(str!=NULL);
	int count=0;
	while(*str!='\0')
	{
		return 1+my_strlen(str+1);
	}
}
int main()
{
	char arr[]="helloworld";
	int ret=my_strlen(arr);
	printf("%d\n",ret);
	return 0;
}

3.指针减指针

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	assert(str!=NULL);
	char* bigan=str;
	while(*str!='\0')
	{
		str++;
	}
	return str-bigan;
}
int main()
{
	char arr[]="helloworld";
	int ret=my_strlen(arr);
	printf("%d\n",ret);
	return 0;
}

2.strcpy

方法1:

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* bigan = dest;
	while (*src!='\0')
	{
		*dest=*src;
		dest++;
		src++;
	}
	*dest=*src;
	return bigan;
}
int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	char* ret = my_strcpy(arr1,arr2);
	printf("%s\n", ret);
}

升级:

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* bigan = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return bigan;
}
int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	char* ret = my_strcpy(arr1,arr2);
	printf("%s\n", ret);
}

3.strcat

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* bigan = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return bigan;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	char* ret = my_strcat(arr1, arr2);
	printf("%s\n", ret);
}

4.strcmp

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

5.strncpy

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, int num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* bigan = dest;
	while (num != 0 && (*dest++ = *src++))
	{
		num--;
	}
	if (num)
	{
		while (num--)
		{
			*dest++ = '\0';
		}
	}
	return bigan;
}
int main()
{
	char arr1[10] = "hello";
	char arr2[] = "world";
	char* ret = my_strncpy(arr1, arr2, 3);
	printf("%s\n", ret);
	return 0;
}

6.strncat

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* src, int num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* bigan = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (num-- &&*src!='\0')
	{
		
		*dest++ = *src++;
	}
	*dest = '\0';
	return bigan;
}
int main()
{
	char arr1[20] = "hell\0oxxxx";
	char arr2[] = "world";
	char* ret = my_strncat(arr1, arr2, 3);
	printf("%s\n", ret);
	return 0;
}

7.strncmp

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* str1, const char* str2,int num)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2 && --num && *str1)
	{
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[] = "hello";
	char arr2[] = "herld";
	int ret = my_strncmp(arr1, arr2,3);
	printf("%d\n", ret);
	return 0;
}

8.strstr

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* s1 = NULL;
	char* s2 = NULL;
	char* ret = str1;
	if (*str1 == '\0')
	{
		return str1;
	}
	while (*ret != '\0')
	{
		s1 = ret;
		s2 = str2;
		while (*s1 == *s2 && *s1!='\0' && *s2!='\0')
		{
			s2++;
			s1++;
		}
		if (*s2 == '\0')
		{
			return ret;
		}
		ret++;
	}
}
int main()
{
	char* arr1 = "abbbcdef";
	char* arr2 = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在");
	}
	else
	{
		printf("%s", ret);
	}
	return 0;
}

9.memcpy

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest != NULL);
	assert(src != NULL);
	void* bigan = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		((char*)dest)++;
		((char*)src)++;
	}
	return bigan;
}
int main()
{
	int arr1[] = {1,2,3,4,5};
	int arr2[5] = { 0 };
	int* ret = my_memcpy(arr2, arr1,sizeof(arr1));
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

10.memmove

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* bigan = dest;
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			((char*)dest)++;
			((char*)src)++;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return bigan;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* ret = my_memmove(arr , arr+2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

11.memset

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
void* my_memset(void* src, int n, size_t num)
{
	assert(src != NULL);
	void* bigan = src;
	while (num--)
	{
		*(char*)src = (char)n;
		((char*)src)++;
	}
	return bigan;
}
int main()
{
	char arr[] = "helloworld";
	char* ret = my_memset(arr, '#', 4);
	printf("%s", ret);
	return 0;
}

12.memcmp

#include<stdio.h>
#include<stdio.h>
#include<assert.h>
int my_memcmp(const void* str1, const void* str2, size_t num)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	const char* p1 = (char*)str1;
	const char* p2 = (char*)str2;
	if (num == 0)
		return 0;
	while (--num && *p1 == *p2)
	{
		p1++;
		p2++;
	}
	return *p1 - *p2;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,5,6,3 };
	int ret = my_memcmp(arr1, arr2, 12);
	printf("%d", ret);
	return 0;
}

总结

在复习过程中我发现我之前写的详解字符串函数的使用中出现了一些错误,可能是因为但是写的太快了,在这里向大家说声抱歉,我也及时的更正过来了。同时这也暴露出了一些问题,第一就是我的不细心,在整理知识的过程中太过于依赖写的笔记,没有特别认真的思考,以及没有对自己的笔记进行检验。第二,对这些只是不是特别熟记于心,对一些小的细节没有把握到位,这一点可能是最为关键的。第三,没有检查到位,写完博客之后就没有认真的检查。综上说明了我们在学习的时候对一些小的细节,以及特容易出现错误的地方要反复的琢磨,反复的练习,同时要养成检查的好习惯,再梳理知识的时候学会独立思考,把知识点理顺,最好是能构思出来,这也可以锻炼一下我们的逻辑推理能力,所以对知识反复深究是我们巩固知识的重要步骤。那最后感谢大家的支持。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初阳hacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值