提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove

strlen

复制代码
#include<stdio.h>

size_t Strlen(const char* src)
{
	size_t count = 0;
	while (*src != '\0')
	{
		src++;
		count++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	printf("%zd", Strlen(arr));
	return 0;
}

strncpy

复制代码
#include<stdio.h>


size_t Strlen(const char* src)
{
	size_t count = 0;
	while (*src != '\0')
	{
		src++;
		count++;
	}
	return count;
}


char* Strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	size_t len = Strlen(src);


	if (len >= num)
	{
		while (num--)
		{
			*dest++ = *src++;
		}
	}
	else
	{
		int tmp = num - len;
		while (len--)
		{
			*dest++ = *src++;
		}
		while (--tmp > 0)
		{
			*dest++ = '\0';	
		}
	}
	*dest = '\0';
	return ret;
}

strcmp

复制代码
#include<stdio.h>
#include<assert.h>


//c++可以用函数重载把strcmp和strncmp实现在一起
int Strcmp(const char* arr1,const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 != '\0' && *arr2 != '\0' && *arr1 == *arr2)
	{
		arr1++;
		arr2++;
	}
	if (*arr1 != '\0' && *arr2 != '\0' && *arr1 > *arr2)
	{
		return 1;
	}
	else if (*arr1 != '\0' && *arr2 != '\0' && *arr1 < *arr2)
	{
		return -1;
	}
	else if (*arr1 == '\0' && *arr2 == '\0')
	{
		return 0;
	}
	else
	{
		if (*arr1 != '\0' && *arr2 == '\0')
		{
			return 1;
		}
		else
		{
			return -1;
		}
	}
	//	assert(str1 && str2);
	//
	//	while (*str1 == *str2)
	//	{
	//		if (*str1 == '\0')
	//			return 0;
	//
	//		str1++;
	//		str2++;
	//	}
	//
	//	return (*str1 - *str2);
}




int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	char arr3[] = "abcdefg";
	char arr4[] = "abd";
	char arr5[] = "abb";
	printf("%d\n", Strcmp(arr1, arr2));
	printf("%d\n", Strcmp(arr1, arr3));
	printf("%d\n", Strcmp(arr1, arr3));
	printf("%d\n", Strcmp(arr1, arr4));
	printf("%d\n", Strcmp(arr1, arr5));
	return 0;
}

strcat

复制代码
#include<stdio.h>
#include<assert.h>


char* Strcat(char* arr1,const char* arr2)
{
	assert(arr1 && arr2);


	char* ret = arr1;
	while (*arr1 != '\0')
	{
		arr1++;
	}
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}


int main()
{
	//如果这里我不提前给arr1一个20的初始空间的话
	//编译器自动赋值成6,追加之后arr1长度会超出范围
	char arr1[20] = "abcdef";
	char arr2[] = "ghi";
	printf("%s", Strcat(arr1, arr2));
	return 0;
}

strstr

复制代码
#include<stdio.h>
#include<assert.h>


size_t Strlen(const char* src)
{
	size_t count = 0;
	while (*src != '\0')
	{
		src++;
		count++;
	}
	return count;
}


char* strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);


	char* ret = arr1;
	char* p1 = ret;
	char* p2 = arr2;
	size_t len1 = Strlen(arr1);
	size_t len2 = Strlen(arr2);


	while (*(ret + len2) != '\0')
	{
		if (*ret != *p2)
		{
			ret++;
			len1--;
		}
		if (len1 > 0)
		{
			p1 = ret;
		}
		else
		{
			return NULL;
		}


		while (*p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return ret;
		}
		ret++;
		p1 = ret;
		p2 = arr2;
	}
}


int main()
{
	char arr1[] = "abbbcbcf";
	char arr2[] = "bbc";
	char arr3[] = "bbbb";
	char arr4[] = "xyz";
	printf("%s\n", strstr(arr1, arr2));
	printf("%s\n", strstr(arr1, arr3));
	printf("%s\n", strstr(arr1, arr4));
	return 0;
}

memcpy

复制代码
#include<stdio.h>
#include<assert.h>


void* Memcpy(void* arr1,const void* arr2, int num)
{
	void* ret = arr1;
	assert(arr1 && arr2);
	while (num--)
	{
		*((char*)arr1+num) = *((char*)arr2 + num);
	}
}


int main()
{
	int arr1[20] = { 0 };
	int arr2[] = { 1,2,3,4,5,6,7,8,9 };
	Memcpy(arr1, arr2, 4 * sizeof(arr2[0]));
	return 0;
}

memmove

复制代码
#include<stdio.h>
#include<assert.h>


void* Memmove(void* arr1,const void* arr2, int num)
{
	void* ret = arr1;
	assert(arr1 && arr2);


	if (arr1 < arr2)
	{
		while (num--)
		{
			*((char*)arr1) = *((char*)arr2);
			++(char*)arr1;
			++(char*)arr2;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)arr1 + num) = *((char*)arr2 + num);
		}
	}
}


int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
	Memmove(arr1+4, arr1, 4 * sizeof(arr1[0]));
	return 0;
}
相关推荐
遇见尚硅谷1 小时前
C语言:20250714笔记
c语言·开发语言·数据结构·笔记·算法
koooo~7 小时前
JavaScript 与 C语言基础知识差别
c语言·开发语言·javascript
mit6.8248 小时前
[Nagios Core] 通知系统 | 事件代理 | NEB模块,事件,回调
c语言·开发语言
mit6.8248 小时前
[Nagios Core] 事件调度 | 检查执行 | 插件与进程
c语言·开发语言·性能优化
刃神太酷啦9 小时前
C++ 多态详解:从概念到实现原理----《Hello C++ Wrold!》(14)--(C/C++)
java·c语言·c++·qt·算法·leetcode·面试
弱冠少年10 小时前
ESP-Timer入门(基于ESP-IDF-5.4)
c语言
mit6.82410 小时前
[Nagios Core] struct监控对象 | 配置.cfg加载为内存模型
c语言·开发语言
遇见尚硅谷1 天前
C语言:游戏代码分享
c语言·开发语言·算法·游戏
Jess071 天前
归并排序递归法和非递归法的简单简单介绍
c语言·算法·排序算法
双叶8361 天前
(C++)STL标准库(vector动态数组)(list列表)(set集合)(map键值对)相关对比,基础教程
c语言·开发语言·数据结构·c++·list