遥遥领先的内存函数

news2025/1/23 17:29:56

目录

​编辑

函数介绍

1.1 strlen

1.2 strcpy

1.3 strcmp

1.4 strcat

1.5 strstr

2.1 memcpy

2.2 memmove

2.3 memcmp

函数实现

1.1 strlen

1.2 strcpy

1.3 strcmp

1.4 strcat

1.5 strstr

2.1 memcpy

2.3 memcmp


函数介绍

1.1 strlen

size_t strlen ( const char * str );

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。 包含空格

参数指向的字符串必须要以 '\0' 结束。

函数的返回值为size_t,是无符号的。

strlen用于计算字符串长度   而sizeof()用于计算大小  只关注括号内的类型 

1.2 strcpy

char* strcpy(char * destination, const char * source );

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷贝到目标空间。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变

返回值为char*  记录着复制前的destination地址

1.3 strcmp

int strcmp ( const char * str1, const char * str2 );

第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字

根据字符的ASCALL码值进行比较

1.4 strcat
 

char * strcat ( char * destination, const char * source );

源字符串必须以 '\0' 结束。

目标空间必须有足够的大,能容纳下源字符串的内容。

目标空间必须可修改。

1.5 strstr

char * strstr ( const char *str1, const char * str2);

返回指向str1中第一个出现的str2的指针   如果找不到则返回空指针

2.1 memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

这个函数在遇到 '\0' 的时候并不会停下来。

如果source和destination有任何的重叠,复制的结果都是未定义的。

函数的指针类型使用了void* 类型进行接受  void* 指针不能进行计算 

故在实现函数时需要进行强制转换  强制转换为 char* 类型  char* 类型遍历为一字节 精度最细  适用于所有类型的复制

2.2 memmove

void * memmove ( void* destination, const void * source, size_t num );

memmove根据   dest与src的位置   区分为两种交换方式

dest在src前   前 -> 后                       其余情况    后 ->前

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

如果源空间和目标空间出现重叠,就得使用memmove函数处理

2.3 memcmp

int memcmp ( const void * ptr1,const void * ptr2,size_t num );

比较从ptr1和ptr2指针开始的num个字节

返回值比较情况
<0          ptr1 < ptrr2
0ptr1 = ptrr2
>0ptr1 > ptrr2

函数实现

1.1 strlen

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


#include <string.h>






int my_strlen(const char* str)
{
	int count = 0;


	while (*str)
	{
		str++;
		count++;
	}


	return count;


}




int main()
{


	char arr[] = "abcdef";


	printf("%d",my_strlen(arr));


	return 0;
}

1.2 strcpy

#define _CRT_SECURE_NO_WARNINGS 1



#include <stdio.h>


#include <assert.h>




char* my_strcpy(char* des, const char* src)
{


	char* temp = des;


	assert(des != NULL);
	assert(src != NULL);


	while (*src)
	{
		*des = *src;
		des++;
		src++;
	}
	*des = *src;   //将\0拷贝


	return temp;




}







int main()
{


	char arr1[] = "aacd";
	char arr2[] = "xxx";


	my_strcpy(arr1, arr2);


	printf("arr2:%s\narr1:%s", arr2, arr1);


	return 0;


}

1.3 strcmp

#define _CRT_SECURE_NO_WARNINGS 


#include <stdio.h>




int my_strcmp(const char* str1, const char* str2)
{


	while (*str1 == *str2)
	{


		if (*str1 == "\0")
		{
			return 0;
		}
		str1++;
		str2++;


	}
	if (*str1>*str2)
	{
		return 1;
	}
	else
	{
		return -1;
	}


}






int main()
{


	char arr1[] = "bbbbb";
	char arr2[] = "abce";


	printf("%d", my_strcmp(arr1, arr2));
	
	return 0;
}

1.4 strcat
 

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


#include <assert.h>


char* my_strcat(char* des, const char* src)
{
	assert(des);
	assert(src);


	char* temp = des;


	while (*des)
	{
		des++;
	}


	while (*src)
	{
		*des++ = *src++;


	}


	return temp;


}






int main()
{


	char arr1[30] = "Hello World";
	char arr2[] = "acbde";




	my_strcat(arr1, arr2);


	return 0;
}

1.5 strstr

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>






char* my_strstr(char* str1 , char* str2)
{


	char* cp = str1;
	char* s1 = cp;
	char* s2 = str2;


	if (*str2 == "\0")
	{
		return str1;
	}


	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}


		cp++;
	}




	return NULL;


}





int main()
{


	char arr1[] = "abcbbcdaaa";
	char arr2[] = "bbc";
	
	char* ret = my_strstr(arr1, arr2);
	
	if (ret!=NULL)
	{
		printf("%s\n", ret);


	}
	else
	{
		printf("找不到\n");
	}


	return 0;
}

2.1 memcpy

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


#include <assert.h>




//函数拷贝结束后,返回目标空间的起始地址  //void* 不能运算 要强转
void* my_memcpy(void* des, const void* src, int num) //num单位是字节
{


	void* ret = des;
	assert(src && des);




	while (num--)
	{


		*(char*)des = *(char*)src;


		//强制类型转换时临时的  以下写法某些编译器无法通过
		//((char*)des)++;   
		//((char*)src)++;


		des = (char*)des + 1;
		src = (char*)src + 1;


	}


	return ret;








}




int main()
{


	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = {0};




	char arr3[] = "abcde";
	char arr4[10] = {0};




	my_memcpy(arr2,arr1,20);
	
	my_memcpy(arr4,arr3, 3);


	int i = 0;


	for ( i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");


	int j = 0;


	for (i = 0; i < 10; i++)
	{
		printf("%c ", arr4[i]);
	}




	return 0;
}

2.3 memcmp

#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>


#include <assert.h>






void* my_memmove(void* dest, const void* src, size_t num)
{


	assert(dest && src);


	void* ret = dest;


	int i = 0;


	if (dest < src)    //前 - > 后  拷贝
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;


		}
	}
	else  	//后 -> 前
	{


		while (num--)
		{


			*((char*)dest + num) = *((char*)src + num);


		}




	}


	return ret;


}






int main()
{




	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	           // 3 4 5 6 7 6 7 8 9 10   


 


	char arr3[] = "abcde";
                //cdede




	my_memmove(arr1, arr1+2, 20);


	my_memmove(arr3, arr3+2, 3);







	int i = 0;




	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");




	printf("%s", arr3);




	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring面试】七、AOP相关

文章目录 Q1、什么是AOP&#xff1f;能做什么&#xff1f;Q2、解释下Spring AOP中常见的概念名词Q3、Spring AOP的通知有哪些类型&#xff1f;Q4、Spring AOP和AspectJ AOP有什么区别&#xff1f;Q5、JDK动态代理和CGLIB动态代理的区别是什么&#xff1f;Q6、JavaConfig方式如何…

本地docker注册证书docker login连接到harbor仓库、利用shell脚本将大量镜像pull、tag、push到私有harbor仓库

1. 本地docker注册证书docker login连接到harbor仓库&#xff1a; 我们使用docker login/push/pull去与Harbor打交道&#xff0c;上传下载镜像等。 但是可能会出现x509: certificate signed by unknown authority之类的错误。 [roottest01 harbor.dev]# docker login harbor.d…

Nacos server 2.2.3 功能参数配置

1、Nacos server下载 登录网址Releases alibaba/nacos GitHub&#xff0c;进入下载页面&#xff0c;显示如下&#xff1a; 选择“nacos-server-2.2.3.zip”版本 解压缩&#xff0c;目录文件如下图所示&#xff1a; 配置文件位于“conf”目录下&#xff0c;名称为“applicat…

天津DV证书和OV证书的区别

SSL数字证书是一种安全协议&#xff0c;用于在网络传输过程中保护敏感信息&#xff0c;如信用卡号、用户名、密码等。它通过使用公钥和私钥来进行加密和解密&#xff0c;确保数据传输的机密性和完整性。 SSL数字证书的主要作用是在客户端和服务器之间建立安全的连接&#xff0c…

HarmonyOS/OpenHarmony应用开发-DevEco Studio帮助快速入门的使用

DevEco Studio内置有帮助中心&#xff0c;初学HarmonyOS 及OpenHarmony应用、元服务的开发者&#xff0c;通过内置的帮助中去系统的学习相关内容&#xff0c;是边练边学&#xff0c;快速上手的最佳方式。 一、帮助 二、快速开始 三、HarmonyOS应用、元服务开发相关 四、OpenHa…

Idea汉化

下载IDEA官方插件包https://plugins.jetbrains.com/ 输入关键子"chinese"查询汉化包 本地安装

银河麒麟arm服务器设置网卡开机自启

桌面右键打开系统终端 查看网络信息 输入命令&#xff1a; ip a 比如我们要设置eno3网卡 切换到指定目录 输入命令 cd /etc/sysconfig/network-scripts 查看该目录下的文件 输入命令ls 编辑指定网卡信息 vi *eno3 设置onboot项的值为yes &#xff0c;重庆服务器即可 …

Flutter框架和原理剖析

Flutter是Google推出并开源的跨平台开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过Dart语言开发Flutter应用&#xff0c;一套代码同时运行在ios和Android平台。不仅如此&#xff0c;flutter还支持web、桌面、嵌入应用的开发。flutter提供了丰富的组件、接口&…

【论文阅读】 智能合约安全漏洞检测技术研究综述

一、SC安全漏洞事件 2016 年 6 月,黑客利用 DAO(decentralized autonomous organization)合约的可重入漏洞, 窃取了价值约 6000 万美元的以太币(即以太坊数字货币); 2017 年 7 月, 由于 Parity 多签名钱包合约的 Delegatecall 漏洞(parity multi-sig wallet delegatecall&#…

Gogs国内大佬开发的git私有服务

Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。 gogs官网&#xff1a;https://gogs.io/ github地址&#xff1a;https://github.com/gogs/gogs/tree/main/docker docker安装gogs服务 docker pull gogs/gogs 启动gogs容器 docker run --namegogs -…

[NLP] LLM---训练一个中文LLama2的步骤

一 数据集 【Awesome-Chinese-LLM中文数据集】 【awesome-instruction-dataset】【awesome-instruction-datasets】【LLaMA-Efficient-Tuning-数据集】Wiki中文百科&#xff08;25w词条&#xff09;wikipedia-cn-20230720-filteredBaiduBaiKe&#xff08;563w词条&#xff09; …

气传导耳机品牌排行榜前十名,性能出色的气传导耳机分享

​气传导耳机在运动、户外、办公等场景中具有独特的优势。然而&#xff0c;面对市场上琳琅满目的气传导耳机产品&#xff0c;很多用户不知如何下手。接下来&#xff0c;我将推荐市面上热销火爆&#xff0c;并性能出色、性价比高的气传导耳机给大家&#xff0c;希望大家都能选到…

Kubernetes configmap + Secret

secret 参考文档&#xff1a;使用 Secret 安全地分发凭证 | Kubernetes 使用 Secret 安全地分发凭证 创建 Secret&#xff1a; &#xff08;secret.yaml&#xff09; apiVersion: v1 kind: Secret metadata:name: test-secret data:username: bXktYXBwpassword: Mzk1MjgkdmR…

Linux Day13 ---信号量

一、信号量 1.1 一些概念 用来管理对资源的访问 一个特殊的变量&#xff0c;只允许对它进行等待(wait)和发送信号(signal),代表可用资源个数&#xff0c; 取0,1 二值信号量 取 3,5 计数信号量 p操作&#xff1a;原子减一&#xff0c;代表获取资源&#xff0c;可能阻塞 v…

【共建开源】手把手教你贡献一个 SeaTunnel PR,超级详细教程!

Apache SeaTunnel是一个非常易于使用的、超高性能的分布式数据集成平台&#xff0c;支持海量数据的实时同步。每天可稳定高效同步数百亿数据&#xff0c;已被近百家企业投入生产使用。 现在的版本不支持通过jtds的方式链接sqlserver&#xff0c;我们来自己写代码来实现它&…

Spark 框架概述

目录 一、Spark 是什么 1.1 统一分析引擎&#xff1f; 二、Spark 风雨十年 ​三、Spark VS Hadoop(MapReduce) 3.1 面试题&#xff1a;Hadoop 的基于进程的计算和 Spark 基于线程方式优缺点&#xff1f; 四、Spark 四大特点 ​4.1 速度快 4.2 易于使用 4.3 通用性…

使用jib-maven-plugin插件构建镜像并推送至私服Harbor

jib-maven-plugin 插件配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

19-springcloud(下)

一 分布式配置中心 1 Spring Cloud Config 分布式系统面临问题 在分布式系统中&#xff0c;由于服务数量巨多&#xff0c;为了方便服务配置文件统一管理&#xff0c;实时更新&#xff0c;所以需要分布式配置中心组件。 什么是Spring Cloud Config Spring Cloud Config项目是…

20230913java面经整理

1.hashmap为什么重写hashcode必须重写equals&#xff1f;不重写hashcode&#xff1f; hashcode判断对象存放的索引值&#xff0c;equals判断相同索引下对象是否相同&#xff0c;不同则存放&#xff08;链表&#xff09; hashcode提升查询效率&#xff0c;通过哈希计算&#xf…

【【萌新编写riscV之计算机体系结构之CPU 总二】】

萌新编写riscV之计算机体系结构之CPU 总二&#xff08;我水平太差总结不到位&#xff09; 在学习完软件是如何使用之后 我们接下来要面对的问题是 整个程序是如何运转的这一基本逻辑 中央处理器(central processing unit&#xff0c;CPU)的任务就是负责提取程序指令&#xff0…