库函数的模拟实现

2024-01-23 14:14:19 浏览数 (2)

前言:

在上一篇文章中我们了解到了一些库函数的使用,为了加深我们对库函数的理解,我们来模拟实现一下这些库函数的用法。

这是上一篇文章的链接:

http://t.csdnimg.cn/r7SKN

1.模拟实现strlen

模拟实现strlen函数有三种基本方式:

方式1:计数器方式

代码语言:javascript复制
#include<stdio.h>
int my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count  ;
		str  ;
	}
	return count;
}

方式2:不能创建临时变量计数器

代码语言:javascript复制
#include<stdio.h>
int my_strlen(const char* str)
{
	if (*str == '')
		return 0;
	else
		return 1   my_strlen(str   1);
}

方式3:指针-指针的方式

代码语言:javascript复制
#include<stdio.h>
int my_strlen(char* s)
{
	char* p = s;
	while (*p != ‘’)
		p  ;
	return p - s;
}

2.模拟实现strcpy

代码语言:javascript复制
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*dest   = *src  )
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "abc";
	my_strcpy(arr1, arr2);
	printf("%sn", arr1);
	return 0;
}

my_strcpy这个函数的返回值是char*,参数是两个char*的指针,但是第二个参数也就是源字符串是不需要改动的,所以加上const限制一下。 首先我们用while循环,将*src找到的字符存放到*dest里面去,只要这个字符不是,这个循环就还是会执行,然后使用后置 ,跳过一个字符。我们在进入while循环之前使用assert进行断言一下,保证dest和src不为NULL。 strcpy在库函数里面的规定的返回值是目标空间的起始地址,所以先用char*的指针保存一下dest的起始地址,最后返回ret。

3 模拟实现strcat

代码语言:javascript复制
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while(*dest != '')
	{
		*dest  ;
	}
	while (*dest   = *src  )
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	my_strcat(arr1, arr2);
	printf("%sn", arr1);
	return 0;
}

第一步我们先找到目标空间的末尾,也就是找到,第二步进行数据追加。 用第一个while循环找到目标空间的末尾,再用第二个while循环进行数据追加,追加的过程和strcpy是一样的。

4 模拟实现strcmp

代码语言:javascript复制
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		str1  ;
		str2  ;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	char arr1[] = "abz";
	char arr2[] = "abq";
	if (my_strcmp(arr1, arr2) > 0)
	{
		printf(">n");
	}
	else
	{
		printf("<=n");
	}
	return 0;
}

库函数strcmp的返回值是0,<0,>0,所以返回值为int,因为两个参数都不需要修改,所以使用const限制一下,再用assert断言一下。先写一个while函数判断字符是否相同,相同则 进行下一个字符的比较,如果不相同则进入if,判断是>还是<,>则返回1,否则返回-1。

5.模拟实现strstr

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
const char* my_strstr(const char* str1, const char* str2)
{
	const char* cp;//记录开始匹配的位置
	const char* s1;//遍历str1指向的字符串
	const char* s2;//遍历str2指向的字符串

	assert(str1 && str2);
	if (*str2 == '')
		return str1;

	cp = str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1  ;
			s2  ;
		}
		if (*s2 == '')
			return cp;

		cp  ;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";

	const char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到n");
	}
	else
	{
		printf("%sn", ret);
	}

	return 0;
}

首先我们创建一个指针cp,让cp记录开始匹配的位置。再创建一个指针s1,遍历str1指向的字符串。再创建一个指针s2,遍历str2指向的字符串。所以cp一开始指向的就是str1的起始位置,所以使用while循环,如果str1是NIULL就不用找了,直接返回NULL。如果不是空指针,则进入循环,将cp赋给s1,str2赋给s2。再使用一个while循环,如果*s1和*s2都不为空指针且*s1==*s2的话则进入while循环,然后s1 ,s2 ,判断下一个字符是否相等,如果出现了不相等的情况,则cp ,从str1的下一个字符开始判断。用if判断如果s2 出现了等于的情况,那么就是全部找到了,这个时候就返回cp就行了。当s1为的时候也是返回NUL的。

今天的分享到这里就结束啦!谢谢老铁们的阅读,让我们下期再见。

0 人点赞