字符函数,内存函数

写在前面:本文来介绍4个有趣的字符串和3基本的内存函数,以及部分内存函数的模拟实现 


目录

字符函数

1.strstr

2.strtok

3.strerror

4.perror 

 内存函数

1.memcpy

2.memmove

3.memcmp


一,字符函数

1.strstr

  • 通俗理解:就是寻找子串的函数。

到其结果是在一个字符串里寻找指定的子串首地址,并返回首地址,内容即是从首地址到‘\0’。 若找不到就返回(null) 

来看看它的函数形式 

即:strstr(【查询的字符串地址】,【被查询的字符串地址】)

2.strtok

  • 通俗理解:找到特定标号,分隔字符串

其运行大致过程是将给定标号更改为‘\0’,每用一次该函数改一个特定标号为‘\0’

来看看它的函数形式

 

由此我们得知,想要切割一个大于两个标识符的字符串,要多次运用strtok函数来分割

形式:用一次strtok(str,"【标识符】"),后面的strtok(NULL,"【标识符】")

ps:该函数会改动原有的字符串内容,所以一般我们会拷贝一份新字符串来运用,以免丢失原字符串的内容。

3.strerror

  • 通俗理解:该函数将全局变量error进行赋值,然后会根据error对应的值在控制台显示报错原因。

来看看它的函数形式 

4.perror 

  • 通俗理解:就是直接打印errno对应值的错误信息。

来看看它的函数形式 

 我们将perror()和strerror()对比学习,如下图:

 ps:值得注意的是,如果只想用perror()错误信息,而不想输出其他的,可以传空字符串("")过去

 二,内存函数

1.memcpy(模拟实现)

  • 通俗理解:无论什么形式的参数,都可以拷贝内容

该函数的实现是找到储存数据的地址,然后在解引用原地址目的地址将其的内容进行赋值操作,达到拷贝目的。因为获取到的是地址,所以该函数能适用于任意类型的值

形式:memcpy(【目的地址】,【原地址】,要拷贝的字节大小)

 模拟实现代码:

char* my_memcpy(void* destination, void* source, int size)
{
	char* temp = destination;
	while (size--)
	{
		*(char*)destination = *(char*)source;
		destination = (char*)destination + 1;
		source = (char*)source + 1;
	}
	return temp;
}

2.memmove(模拟实现)

  • 通俗理解:功能和memcpy基本一样,只是实现代码不一样 (具体对比模拟实现代码)

 

 模拟实现代码:

char* my_memmove(void* destination, void* source, int size)
{
	char* temp = destination;
	if (destination < source)
	{
		while (size--)
		{
			*(char*)destination = *(char*)source;
			destination = (char*)destination + 1;
			source = (char*)source + 1;
		}
	}
	else
	{
		while (size--)
		{
			* ((char*)destination+size) = *((char*)source+size);
		}
	}
	return temp;
}

3.memcmp

  • 通俗理解:和strcmp函数十分相似,只不过是它的升级版,什么都类型的都可以比较,且能指定长度来比较。

该函数的实现是找到储存数据的地址,然后解引用地址,一个数据一个数据进行比较,若前面数据相同,则长度更长的更大

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值