常见函数剖析

本文介绍了C语言中的字符串函数如strlen、strcmp、strstr,以及内存函数如memcpy和memmove,通过实例演示了它们的用法和模拟实现。重点讲解了字符串长度计算、字符比较和内存数据复制,为开发者提供了一手实践指导。
摘要由CSDN通过智能技术生成


在这里插入图片描述

函数介绍

字符函数

这里进行一些常见字符串函数介绍及使用,模拟实现一些函数。比较常用有求字符串长度(strlen),字符串比较(strcmp)还有对于俩字符串追加(strcat)。当然字符串函数远不止这些 更多

1、strlen

字符串长度
在这里插入图片描述
这里可以看见函数介绍,所以我们可以把函数进行使用后熟悉相关参数后进行模拟。

#include<string.h>

int main()
{
	char ch[] = "asdfg";
	char ch2[] = "asd\0fg";
	int len = strlen(ch);
	int len2 = strlen(ch2);

	printf("ch字符串长度为:%d", len);
	printf("\nch2字符串长度为:%d", len2);
	return 0;
}

运行后可以发现
在这里插入图片描述

ch2和ch数值结果不同,字符串中有\0。后面数值就是\0之前字符个数。这里我们可以知道字符串长度函数截止标志是\0进行模拟时可以就字符而言。
然后我们就开始模拟实现

#include<assert.h>
size_t my_strlen(const char* str)
{
	assert(str);
	const char* start = str;
	const char* end = str;
	while (*end)
	{
		end++;
	}
	return end - start;
}

int main()
{
	char ch[] = "";
	printf("字符串长度为:%d", my_strlen(ch));
	return 0;
}

其实模拟方法不止一种,所谓条条大路通罗马。不过对比后发现指针模拟实现最容易理解和直观。特别注意是返回值是size_t。进行减法运算后是一个永远大于0的数。如果用在条件判断中是一个非常好的bug。

2、strcmp

这个函数可以配合用于简单实现一些程序逻辑是应用,例如对于密码判断,可以简单实现。字符串判断是对应位置字符判断。
在这里插入图片描述
这是基本参数,使用时还应该注意返回值。函数是否具有返回值,会影响后面函数进行使用和实现效果与预期效果差异。返回值可以看见值不是唯一,只是值域范围。
在这里插入图片描述

模拟实现后

int my_strcmp(const char* str, const char* arr)
{
	assert(str && arr);
	while (*str == *arr)
	{
		if (*arr == '\0')
		{
			return 0;
		}
		arr++;
		str++;
	}
	return str - arr;
}

int main()
{
	char arr[] = "yes";
	char srr[] = "yes";
	if (my_strcmp(arr, srr) > 0)
	{
		printf(">");
	}
	else if (my_strcmp(arr, srr) < 0)
	{
		printf("<");
	}
	else
		printf("=");
	return 0;
}


3、strstr

如果在一个长字符串中查找个字符串,眼花缭乱字母涌入眼睛,还有密密麻麻数不清第几个位置。他就可以帮你找到并带来你的眼前。而它只需要你给他要去的地址,还有要找的类型,或者给他描述。茫茫人海依旧如约而至。
在这里插入图片描述
邂逅在这里开始

char* my_strstr(const char* str,const  char* arr)
{
	const char* p = str;
	const char* s1 = str;
	const char* s2 = arr;
	if (*s2 == '\0')
	{
		return str;
	}
	
	while (*p)
	{
		s1 = p;
		s2 = arr;
		while ((s1 != '\0') && (s2 != '\0') && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;
}


int main()
{
	char str[] = "hellow boy!!";
	char arr[] = "hellow";

	char* pch=my_strstr(str, arr);
	if (pch == NULL)
	{
		printf("没有该字符串");
	}
	else
	{
		printf("%s", pch);
	}
	return 0;
}

有了这些字符串函数还有大千世界,毕竟世界不止有char,还有int,float……

内存函数

1、memcpy

这是一个内存拷贝函数,可以进行内容拷贝。参数和前面strncpy有着异曲同工之妙。接下来可以看下参数
在这里插入图片描述
第三个参数是字节数。所以对于内容拷贝,需要观察计算字节数。如果是汉字拷贝需要注意是2个字节。可以进行简单模拟。

void* my_memcpy(void* ch, const void* str, size_t num)
{
	assert(ch);
	assert(str);
	void* ret = ch;
	if (ch <= str)
	{
		while (num--)
		{
			*(char*)ch = *(char*)str;
			ch = (char*)ch + 1;
			str = (char*)str + 1;
		}
	}
	return ret;
}
int main()
{
	char arr[] = "$$$$$$$$$";
	char str[] = "努力去挣";
	printf("%s",my_memcpy(arr, str,8));
	return 0;
}

当我们这里可以进行内容拷贝后还有一种比较特殊,就是拷贝内容本身在自己后面追加自己内容时,这里就需要看情况而定了。直接在后面追加就很简单。容易实现。但是重叠时这里就要考虑内容拷贝先后顺序了。

2、 memmove

这个函数便是加强版memcpy,它可以处理重叠部分。直接上参数
在这里插入图片描述
这里可以进行重叠部分处理:

图太丑了,哈哈

这里中间部分就是需要解决,可以从前往后,也可以从后向前拷贝。这里就需要一个简单示意图。在这里插入图片描述

假如我们从前向后拷贝,1、3部分可以随大流,由前向后。2部分就必须是后面a开始拷贝,向后移。不然就会被前面值覆盖。另外一种就是后向前拷贝,这里就是2、3依旧是后向前拷贝,1是前向后拷贝。避免值被覆盖。

void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);

	if (dest < src)//1 前->后
	{
		while(num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else //2 3 后->前
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

这里边可以实现前面介绍的函数了。对于函数使用需要了解它的参数,返回值,有了深刻认识才会方便我们后期游刃有余去使用。

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Taran_yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值