strlen、strcpy、strcmp、strcat、strstr函数的模拟实现

strlen、strcpy、strcmp、strcat、strstr函数均为字符串处理函数,使用时需要包含头文件string.h

strlen函数

strlen函数主要用于求字符串的长度。

#include 

int my_strlen(const char* str)
{
	int count = 0;
	while (*str++)  //\0的ASCII码是0
	{
		count++;
	}
	return count;
}

int main()
{
	char ch[] = "student";
	printf("%d", my_strlen(ch));
	return 0;
}

strlen模拟的其他两种方法

1、用指针相减方法

strlen、strcpy、strcmp、strcat、strstr函数的模拟实现_第1张图片

2、用递归的方法

strlen、strcpy、strcmp、strcat、strstr函数的模拟实现_第2张图片

strlen、strcpy、strcmp、strcat、strstr函数的模拟实现_第3张图片

strcpy函数

原型:   char* strcpy(char *dest,char *src)    功能:将源字符串复制到目的字符串(包括源字符串最后的\0),函数返回值为目的字符串首地址
 注意事项:1、要保证目的字符数组足够大  2、主函数中的目的字符串不能用char*来定义(char*默认定义为常量字符串,内容不可修改)


//1.简单易懂版
#include 
char* my_strcpy(char* dest,char* src)
{
	char* ret = dest;    //提前保存目的字符串首地址
	while (*src != '\0') //*src
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = *src;        //复制最后的\0
	return ret;
}

int main()
{
	char ch1[20] = { 0 };
	char ch2[] = "student";
	printf("%s", my_strcpy(ch1,ch2));
	return 0;
}

//2.优化版本
#include 
char* my_strcpy(char* dest, char* src)
{
	char* ret = dest;    //提前保存目的字符串首地址
	while (*dest++ = *src++) //src最后的\0也会复制给dest,且*dest最后的结果是\0(ASCII码为0),退出循环。
	{
		;
	}
	return ret;
}

int main()
{
	char ch1[20] = { 0 };
	char ch2[] = "student";
	printf("%s", my_strcpy(ch1, ch2));
	return 0;
}

strcmp函数    

原型:  int strcmp(const char* s1,const char* s2)     功能:逐个比较两个字符串每个字符的大小,返回值>0、=0、<0分别表示第一个字符串大于、等于、小于第二个字符串

#include 
int my_strcpy(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
		{
			return 0;       //两个字符串相等,直接返回,不需要下面的指针++
		}
		s1++;
		s2++;
	}
	if (*s1 > *s2)          //return *s1-*s2;
	{
		return 1;
	}
	else
	{
		return -1;
	}
}

int main()
{
	int temp = my_strcpy("strlena", "strlena");
	if (temp > 0)
	{
		printf("第一个字符串大");
	}
	else if (temp < 0)
	{
		printf("第二个字符串大");
	}
	else 
		printf("两个字符串一样大");
	return 0;
}

strcat函数

函数原型:  char* strcat(char* dest,const char* src)    函数功能:将src字符串从dest的\0位置开始复制,一直复制到src的最后

#include 
char* my_strcat(char* dest, char* src)
{
	char* ret = dest;        //提前保存目的字符串首地址
	while (*dest)            //找到dest字符串\0的位置
	{
		dest++;
	}
	while (*dest++ = *src++) //src最后的\0也会复制给dest,且*dest最后的结果是\0(ASCII码为0),退出循环。
	{
		;
	}
	return ret;
}

int main()
{
	char ch1[20] ="good ";
	char ch2[] = "student";
	printf("%s", my_strcat(ch1, ch2));
	return 0;
}

strstr函数

函数原型:char* strstr(const char* str1,const char* str2)  功能:在str1字符串中寻找str2字符串,如果找到,返回str1中指向str2首元素的指针,没有找到返回NULL
思路:分别从str1的第n个元素与str2进行匹配(建立两个指针s1与s2操作),不满足则后移str1的指针(建立第一个指针cur操作)。
退出内部while比较的3个条件:1.s1 != \0,s2 == \0 找到了 2.s2找到了\0 找到了 3.*s1 != *s2

#include 
char* my_strstr(const char* str1, const char* str2)
{
	char* cur = (char*)str1;
	char* s1 = NULL;
	char* s2 = NULL;

	if (*str2 == '\0') //特殊情况,str2为'\0'的情况
	{
		return cur;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
        //1.循环过程中因*s1=='\0'退出while-->'1:*s2!='\0',没找到str2 '2:*s2=='\0',找到str2
        //2.循环过程中因*s2=='\0'退出while-->找到了str2
        //3.循环过程中因*s1 != *s2退出while-->'1:*s2!='\0',没找到str2 '2:*s2=='\0',找到str2
        //条件不仅仅是*s1 == *s2是为了避免str1与str2相等, 指针向后移越界访问的情况
		while (*s1 && *s2 && *s1 == *s2) 
		{
			s1++;     
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}	
		cur++;
	}
	return NULL;
}

int main()
{
	char ch1[] ="goodsstudents";
	char ch2[] ="student";
	if (my_strstr(ch1, ch2) == NULL)
	{
		printf("没找到");
	}
	else
	{
		printf("找到了");
		printf("%s", my_strstr(ch1, ch2));
	}
	return 0;
}

//上述代码可以应对str1和str2的各种情况
//一般情况
//char ch1[]="goodstudents"  char ch2[]="student" 
//特殊情况
//1:char ch1[]="goodstudents"  char ch2[]="\0"       -->找不到,返回NULL
//2:char ch1[]="\0"  char ch2[]="student"            -->找不到,返回NULL
//3:char ch1[]="goodsstudents"  char ch2[]="student" -->可以找到
//4:char ch1[]="student"  char ch2[]="student"       -->可以找到

你可能感兴趣的:(算法)