字符串函数及内存函数讲解(含模拟实现详细代码)

发布于:2022-12-01 ⋅ 阅读:(625) ⋅ 点赞:(0)

这篇文章主要包含了各种字符串函数、内存函数的讲解,以及各类函数详细的模拟实现过程。

字符串函数

1.strlen

在这里插入图片描述

strlen的功能

int main()
{
	char str[20] = { 0 };
	scanf("%s", str);//abcdef
	int len = strlen(str);
	printf("%d\n", len);//6
	return 0;
}

用于求解字符串长度,返回类型为size_t

strlen的模拟实现

//int my_strlen(char* str)
//{
//	int count = 0;
//	while (*str)
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
int my_strlen(char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

字符串总以’\0’为结束标志,strlen用于统计’\0’之前的字符个数并返回。注意区分strlen()与sizeof()的不同,strlen为字符串函数,统计字符个数,只能用于字符串;而sizeof为操作符,用于计算所占内存的大小。

一、长度不受限制的字符串函数

1.strcpy

在这里插入图片描述
strcpy的功能

int main()
{
	char str1[] = "abcdef";
	char str2[20];
	strcpy(str2, str1);
	printf("str2:%s\n", str2);//abcdef
	return 0;
}

用于拷贝字符串,连同‘\0’一起拷贝。返回目的字符串的首地址

strcpy的模拟实现

char* my_strcpy(char* des, const char* src)
{
	assert(des);
	assert(src);
	char* ret = des;
	while (*des++ = *src++)
	{
		;
	}
	return ret;
}

2.strcat

在这里插入图片描述
strcat的功能

int main()
{
	char str1[20];
	char str2[20];
	gets(str1);//hello
	gets(str2);//world
	printf("%s\n", strcat(str1, str2));//hello world
	return 0;
}

用于追加字符串,将函数第一个参数的字符串的结束标志\0’修改,并在其后面进行追加。

strcat的模拟实现

char* my_strcat(char* des, const char* src)
{
	int len = strlen(des);
	char* end = des + len;
	while (*end++=*src++)
	{
		;
	}
	return des;
}

3.strcmp

在这里插入图片描述
strcmp的功能

int main()
{
	char str1[20];
	char str2[20];
	scanf("%s%s", str1, str2);//str1:abcd;  str2:abdf
	int ret = strcmp(str1, str2);
	printf("%d\n", ret);//-1
	return 0;
}

strcmp用于比较两个字符串,若两字符串相等,则返回1,若前一个字符串小于第二个字符串,则返回一个小于0的数字,否则,返回一个大于0的数字。

在这里插入图片描述

strcmp的模拟实现

int my_strcmp(char* str1, char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 = '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

4.strstr

在这里插入图片描述
strstr的功能

int main()
{
	char str1[20];
	char str2[20];
	scanf("%s%s", str1, str2);//str1:abcdef   str2:cde
	printf("%s\n", strstr(str1, str2));//cdef
	return 0;
}

用于在一个字符串中查找一个子字符串,若能找到,则返回字符串中该子字符串的起始位置,否则,返回一个空指针。

在这里插入图片描述

strstr的模拟实现

char* my_strstr(const char* str1, const char* str2)
{
	char* ps1 = str1;
	char* ps2 = str2;
	while (*str1 != '\0')
	{
		if (*str1 != *str2)
		{
			ps1++;
			str1 = ps1;
			str2 = ps2;
		}
		else
		{
			str1++;
			str2++;
		}
		if (*str2 == '\0')
			return ps1;
	}
	
}

二、长度受限制的字符串函数

1.strncpy

在这里插入图片描述
strncpy的功能

int main()
{
	char str1[20] = "abcdef";
	char str2[20] = "******";
	printf("%s\n", strncpy(str1, str2, 4));//****ef
	return 0;
}

用于拷贝字符串,以字节为单位,从source中拷贝num个字节到destination,细节与上述strcpy相同。

2.strncat

在这里插入图片描述
strncat的功能

int main()
{
	char str1[20] = "hello ";
	char str2[20] = "world!!!!!";
	//printf("%s\n", strncat(str1, str2, 5));//hello world
	printf("%s\n", strncat(str1, str2, 7));//hello world!!
	return 0;
}

用于追加字符串,以字节为单位,具体细节与strcat相同。

3.strncmp

在这里插入图片描述

strncmp的功能

int main()
{
	char str1[20] = "abcdef";
	char str2[20] = "abcdeg";
	printf("%d\n", strncmp(str1, str2, 5));//0
	printf("%d\n", strncmp(str1, str2, 6));//-1
	return 0;
}

用于比较指定字节数内的字符串,具体细节与strcmp相同。

内存操作函数

1.memcpy

在这里插入图片描述

memcpy的功能

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr1, arr2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);//0 0 0 0 0 6 7 8 9 10
	}
	return 0;
}

从source的位置开始向后复制num个字节的数据到destination的内存位置,遇到’\0’时,该函数也不会停止。
在这里插入图片描述
返回的是destination的地址

memcpy的模拟实现

void* my_memcpy(void* des, void* src, size_t num)
{
	void* ret = des;
	while (num)
	{
		*(char*)des = *(char*)src;
		des = (char*)des + 1;
		src = (char*)src + 1;
		num--;
	}
	return ret;
}

2.memmove

在这里插入图片描述
memmove的功能

int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	memmove(arr + 2, arr, 12);
	//memmove(arr + 2, arr, 12);
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		printf("%d ", arr[i]);//1 2 1 2 3 6 7
	}
	return 0;
}

memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的

memmove的模拟实现

void* my_memmove(void* des, void* src, size_t num)
{
	void* ret = des;
	assert(des);
	assert(src);
	if (src < des)
	{
		while (num--)
		{
			*((char*)des + num) = *((char*)src + num);
		}
	}
	else
	{
		while (num--)
		{
			*(char*)des = *(char*)src;
			des = (char*)des + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}

3.memset

在这里插入图片描述
memset的功能

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memset(arr1, 0, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);//0 0 0 0 0 6 7 8 9 10
	}
	return 0;
}

对内存块中的值进行指定字节的初始化

4.memcmp

在这里插入图片描述

memcpy的功能

int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	printf("%d\n", n);//1
	return 0;
}

对内存块中的内容进行比较,并返回一个整数。
在这里插入图片描述

返回比较的数值。

总结

这篇文章基本涵盖了字符串函数以及内存函数的所有知识,帮助自己理解归纳的同时也希望能够帮助一些小伙伴们!在看这篇文时,小伙伴们如果有不清楚的地方都可以私信问我。当然,如果有写得不对不好的地方,也希望大家能够帮忙斧正!

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到