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

发布时间:2023年12月28日

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

strlen函数

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

#include <stdio.h>

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、用指针相减方法

2、用递归的方法

strcpy函数

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


//1.简单易懂版
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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操作)。
退出比较的3个条件:1.s1 != \0,s2 == \0 找到了 2.s2找到了\0 找到了 3.*s1 != *s2

#include <stdio.h>
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;
		while (*s1 && *s2 && *s1 == *s2) //避免str1与str2相等,指针向后移越界访问的情况
		{
			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;
}
文章来源:https://blog.csdn.net/qq_52907930/article/details/135254517
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。