提升内功之模拟实现库函数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;
}
相关推荐
·present·2 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
wuyk55515 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
Navigator_Z1 天前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
冻柠檬飞冰走茶1 天前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
Hhy_11071 天前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
曦樂~2 天前
Cpp面筋
c语言·c++
HUANGZHENXUAN1232 天前
最大子矩阵和:从 O(n⁴) 到 O(n³) 的列压缩 + Kadane
c语言·前端
§ꦿCFོ༉2 天前
嵌入式八股文—C语言入门学习(二)
c语言·学习·嵌入式·编程语言
David猪大卫3 天前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
Zwawa3 天前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式