提升内功之模拟实现库函数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;
}
相关推荐
末代iOS程序员华仔9 分钟前
Codex + Figma 生成 Objective‑C (UIKit) 完整工作流
c语言·开发语言·figma
octopus_c4 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
wuminyu14 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
kkkkkkkkkk_Z15 小时前
学嵌入式和C语言编程数据结构|学习日记Day21:内核链表与队列学习
c语言·数据结构·学习
不正经学生15 小时前
C语言结构体:自定义数据类型,让变量打包出行
java·c语言·开发语言·数据结构·算法
老一岁16 小时前
c问题总结(1)
c语言·开发语言
一木 之林16 小时前
三、内存管理、指针与堆栈
c语言·jvm·c++
笨笨饿16 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
caimouse17 小时前
ReactOS 窗口系统分析(20):光标与图标 — cursoricon.c
c语言·开发语言
H_oRIZoN_17 小时前
Linux入门DAY23(C语言树形结构)
linux·c语言·数据结构