C语言常见字符串函数模拟实现一

strlen模拟实现

重点:1.字符串已经'\0'作为结束标志,strlen返回的是字符串'\0'前面出现的字符个数(不包含'\0')

2.参数指向的字符串必须要以'\0'结束。

3.注意函数的返回值是size_t,是无符号的,加减是无法对比的。

模拟:

cs 复制代码
size_t my_strlen(const char* arr)
{
	size_t num = 0;
	while (*(arr++) != '\0')
	{
		num++;
	}
	return num;
}

int main()
{
	char arr[] = "abcdef";
	
	printf("%zd\n", my_strlen(arr));
}

strcpy模拟实现

重点:1.源字符串必须以'\0'结束

2.函数会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保能存放源字符串

4.目标空间必须可变

模拟:

cs 复制代码
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20];
	char arr2[] = "abcdef";
	printf("%s\n", my_strcpy(arr1, arr2));
}

strcat模拟实现

重点:1.源字符串必须以'\0'结束

2.目标空间必须足够大,能容纳源字符串的内容

3.目标空间必须可以修改

4.目标空间必须有'\0',函数找到'\0'开始追加

5.字符串不可以自己给自己追加,尽量不要。

模拟:

cs 复制代码
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//断言
	char* ret = dest;
	/*while (*dest++)
	{
		;
	}*///为什么不这么写,因为dest就不会在'\0'上了会在'\0'后面一位
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "abcd";
	char arr2[] = "ef";
	printf("%s\n", my_strcat(arr1, arr2));
}

strcmp模拟实现

重点:1.

2.比较对于位置上字符的大小(ASCLL值),不是长度。

模拟:

cs 复制代码
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;//要相等代表两个字符串长度和对应的字符都一模一样
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abce";
	if (my_strcmp(arr1, arr2) > 0)
	{
		printf(">\n");
	}
	else if (my_strcmp(arr1, arr2) == 0)
	{
		printf("==\n");
	}
	else
	{
		printf("<\n");
	}
}

strstr模拟实现

模拟:

cs 复制代码
#include<stdio.h>
#include<assert.h>
//strstr函数模拟,在字符串中找字符串函数

char* my_strstr(const char* arr1,const char* arr2)
{
	assert(arr1 && arr2);
	char* cp = arr1;//记录起点
	char* s1 = arr1;//遍历的指针
	char* s2 = arr2;
	if (!*s2)//如果源字符串什么都没有直接返回目标字符串
	{
		return arr1;
	}
	while (*cp++)
	{
		s1 = cp;
		s2 = arr2;
		while ((*s1 == *s2) && *s1 && *s2)//'\0'停下
		{
			s1++;
			s2++;
		}
		if (!*s2)
		{
			return cp;
		}
	}//其实这里还可以再简洁一点
	return NULL;
}

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

	printf("%s\n", my_strstr(arr1, arr2));
}

补充:strstr函数模拟实现还有一种 KMP算法更适合,上面的这种写法还可以再修改,大家可以自己想想。

相关推荐
知识分享小能手4 分钟前
R语言入门学习教程,从入门到精通,R语言数据处理与清洗 (9)
开发语言·学习·r语言
号码认证服务15 分钟前
如何让来电显示公司名代替陌生数字号码?企业号码认证开通指南
服务器·c语言·网络·经验分享·智能手机·云计算·php
计算机安禾18 分钟前
【c++面向对象编程】第19篇:多继承与菱形继承(二):虚拟继承的内存模型与复杂性
开发语言·c++
思麟呀24 分钟前
在C++基础上理解CSharp-1
开发语言·c++·c#
一念春风29 分钟前
QwenPaw(替代小龙虾)大模型
开发语言·php
小短腿的代码世界35 分钟前
Qt状态机框架深度解析:从状态图到事件驱动闭环
开发语言·qt
广州灵眸科技有限公司41 分钟前
瑞芯微(EASY EAI)RV1126B 模型部署API说明
linux·开发语言·网络·人工智能·深度学习·算法·yolo
東隅已逝,桑榆非晚42 分钟前
深⼊理解指针(5)
c语言·笔记·算法
计算机安禾44 分钟前
【c++面向对象编程】第20篇:override与final关键字:现代C++对继承的控制
开发语言·c++
AI科技星1 小时前
全域数学:从理论到现实的终极落地全记录 光速不变公理(v=c)+ 可见派维度常数公理(D_v=3)统一广义相对论与量子力学,解决物理学百年难题
c语言·开发语言