提升内功之模拟实现库函数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;
}
相关推荐
RuoZoe1 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_5 天前
C语言内存函数
c语言·后端
norlan_jame6 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874756 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
m0_531237176 天前
C语言-数组练习进阶
c语言·开发语言·算法
Z9fish6 天前
sse哈工大C语言编程练习23
c语言·数据结构·算法
代码无bug抓狂人6 天前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习
枫叶丹46 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
with-the-flow6 天前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法