• 练习题——【学习补档】库函数的模拟实现


    一、模拟实现strlen

    模拟实现strlen有三种方法
    1.地址-地址型
    2.递归型
    3.计数器型
    
    • 1
    • 2
    • 3
    • 4

    1.地址-地址型

    //	//1.地址-地址型
    #include
    int main()
    {
    	//通过首字符的地址减去最后一个字符的地址来计算字符串长度
    	const char* str =  "abcdef";
    	const char*  p1 = 0;
    	const char*  p2 = 0;
    	p1 = str;
    	while (*(str++) != '\0')
    	{}
    	str--;
    	p2 = str;
    	printf("%d",p2-p1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.递归型

    //2.递归型
    //递归型是通过一个递归,逐个的将字符计算
    #include
    #include
     
    int my_strlen(const char* str)
    {
    	assert(str);
    	if ((*str) != '\0')
    		return my_strlen(++str) + 1;
    	else
    		return 0;
    }
    int main()
    {
    	const char* str =  "abcdef";
    	int ret =my_strlen(str);
    	printf("%d",ret);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.计数器型

    //3.计数器型
    //计数器型是逐个数字符串中的字符个数,直到遇到\0
    #include
    #include
    int my_strlen(const char* str)
    {
    	assert(str);
    	int i = 0;
    	while (*(str++) != '\0')
    	{
    		i++;
    	}
    	return i;
    }
    int main()
    {
    	const char* str =  "abcdef";
    	int ret = my_strlen(str);
    	printf("%d",ret);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    二、模拟实现strcpy

    模拟实现strcpy
    #include
    #include
     
    char* my_strcpy( char* str2, const char* str1)
    {
    	assert(str2 && str1);	//确保两个地址不是空地址
    	char* ret = str2;	//将初始地址保存
    	while(*str2++ = *str1++)	//直接将地址1指向的内容赋给地址2指向的空间
    	{
    		;
    	}
    	return ret;	//返回地址2
    }
    int main()
    {
    	char str1[] = "abcdef";
    	char str2[20] = {0};
    	printf("%s\n", str1);
    	printf("%s\n", my_strcpy(str2, str1));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    三、模拟实现strcmp

    //strcmp功能为比较两个字符串,前一个字符串的每个字符的ascall是否大于后一个
    #include
    #include
    #include
    
    int my_strcmp(const char *str1 ,const char* str2)
    {
    	assert(str1 && str2);
    	while ( *str1 >= *str2)
    	{
    		if (*str2 == '\0')
    			return 0;	//如果str1内包含了完整的str2,则返回0
    		str1++;
    		str2++;
    	}
    	return str1 - str2;		//如果str1的ascal码大于str2 则会返回一个正数,否则会返回一个负数
    }
    
    int main()
    {
    	//首先定义两个字符串用于比较
    	char str1[] = "abcdef";
    	char str2[] = "abcd";
    	
    	if (my_strcmp(str1, str2) > 0)
    	{
    		printf(">\n");
    	}
    	else if (my_strcmp(str1, str2) == 0)
    	{
    		printf("=\n");
    	}
    	else if (my_strcmp(str1, str2) < 0)
    	{
    		printf("<\n");
    	}
    	else
    	{
    		printf("error\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    四、模拟实现strcat

    //strcat的功能是在一个字符串的后面追加另一个字符串,并在这一过程中,覆盖前面字符串的\0,添加后面字符串的\0
    
    #include
    #include
    #include
    
    char* my_strcat(char* str1, const char* str2)
    {
    	//记住各个数组的开头
    	char* p1 = str1;
    	const char* p2 = str2;
    	//找到前面数组str1的尾巴
    	while (*(p1)!='\0')	
    	{
    		p1++;
    	}
    	//将str2的内容接到str1的尾巴上
    	while (*(p2) != '\0')
    	{
    		*(p1++) = *p2;
    		p2++;
    	}
    	*p1 = '\0';
    	return str1;
    }
    
    int main()
    {
    	char str1 [10] = "aaa";
    	char str2 [10] = "bbb";
    	printf("%s", my_strcat(str1, str2));
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    五、模拟实现strstr

    //strstr的功能是在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL
    
    #include
    #include
    #include
    
    const char* my_strstr(const char* str1, const char* str2)
    {
    	assert(str1 && str2);
    	const char* p1 = str1;
    	const char* p2 = str2;
    	const char* cp = str1;
    
    	//找到p1与p2指向相同内容的位置,并确保二者不会出现空对实;
    	while (*(p1) != *(p2))
    	{
    		if (p1 && p2 == 0)
    			return 0;
    		p1++;
    	}
    	//p1、p2内容一致时退出循环
    
    	cp = p1;	//记录p1、p2内容相同且不为/0,的位置的坐标
    
    	//判断后续内容是否一致
    	while (*p1 == *p2)
    	{
    		if (*p2 == '\0')	//当p2的内容被对比完毕时,则说明str1内部含有str2
    			return cp;
    		//如果p2对比还未完成,p1就到头了怎么办
    		if (*p1 == '\0')
    			return 0;
    		p1++;
    		p2++;
    	}
    	return 0;
    }
    
    int main()
    {
    	char str1[] = "abcdef";
    	char str2[] = "def";
    	printf("%p", my_strstr(str1, str2));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    在这里插入图片描述

  • 相关阅读:
    递归 python
    pdf转换器是干什么用的,各种文档互转离不开它!
    Django中使用Celery和APScheduler实现定时任务
    19_ue4进阶末日生存游戏开发[关联UI和数据]
    Python3 集合
    录屏软件用什么好?直播会议用什么录屏软件?
    【docker】harbor私有仓库部署与管理
    Python 查找算法_众里寻他千百度,蓦然回首那人却在灯火阑珊处(线性、二分,分块、插值查找算法)
    10.20作业
    JUC实战经验-CompletableFuture 异步编程利器
  • 原文地址:https://blog.csdn.net/broken_enginer/article/details/134490240