字符串和内存函数

AI智能体实战:从LangChain到多智能体协作的自动化新范式 在人工智能技术快速发展的今天,大语言模型(LLM)已成为推动自动化变革的核心驱动力。其原理在于通过深度学习海量文本数据,使模型能够理解、生成自然语言并执行推理任务。这一技术进步催生了AI智能体(AI Agent)这一新兴概念,它赋予自动化系统自主决策和动态规划能力,从而突破了传统脚本和RPA工具在固定流程上的局限。从技术价值看,AI智能体框架通过封装LLM调用、工具集成与流程编排,显著降低了构建复杂人机协同应用的开发门槛。在实际应用场景中,智能体尤其擅长处理信息调研、内容创作辅助、数据分析等需要处理非结构化 阅读详情

目录

strlen

模拟实现

长度不受限字符串函数 

strcpy

模拟实现

​编辑 strcat

模拟实现

 strcmp

 模拟实现

长度受限字符串函数

strncpy

模拟实现

strncat

strncmp

strstr 

模拟实现

 strtok

strerror

perror

字符分类函数

字符转换

示例:

​编辑内存函数

memcpy

模拟实现 

memmove

 模拟实现

memcmp

 memset


strlen

功能:统计字符串中\0之前的字符个数。

注意:如果没有\0则返回一个随机值。

易错: 

 

strlen的返回值为size_t,也就是无符号整形,使用时要注意这点。 

模拟实现

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

长度不受限字符串函数 

strcpy

功能:将一个源头字符串拷贝到一个目标字符串中

注意:如果源头字符串没有\0则会报错。目标空间要足够大,且可变。

 易错:

	char* p = "hello";//常量字符串
	char arr[] = "world";
	strcpy(p, arr);

模拟实现

char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* str = dest;
	while (*dest++ = *src++)\\取巧写法,注意后置++不会对程序产生影响
	{
		;
	}
	return str;//能够被接收
}

测试结果: 

 strcat

功能:在一个字符串后面追加另一个字符串。

注意:目标空间要足够大,且可变。都需要包含\0。

易错:

 追加位置在\0处:

模拟实现

char* my_strcat(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* str = dest;
	while (*dest)//\0处追加,循环体内++
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return str;
}

注意不要利用strcat去追加自身,否则会造成死循环!

 strcmp

功能:比较字符串对应位置的ascii码大小

注意:都要包含\0。

 模拟实现

//写法1
int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')//全等
		{
			return 0;
		}
		s1++;
		s2++;
	}
	if (*s1 > *s2)
		return 1;
	else 
		return -1;
}
//写法2
int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 - *s2;
}

长度受限字符串函数

strncpy

模拟实现

模拟实现一次,后续不再模拟实现。

具体逻辑是用一个无符号整数加入循环条件,如果需要拷贝的源头字符串超过了自身长度可以考虑给多余的地方拷贝\0。 

char* my_strncpy(char* dest, const char* src,size_t size)
{
	assert(dest);
	assert(src);
	char* str = dest;
	while (size && (*dest++ = *src++))//=优先级最低,所以加()
	{
		size--;
	}
	if(size)	//超出源头字符串长度
		while (--size)
		{
			*dest++ = '\0';
			size--;
		}
	return str;
}

strncat

将n个子串拷贝到目标字符串后,自动补\0,可以自己增添自己。

strncmp

比较n个子串的大小,大于返回正数,小于返回负数,等于返回0。

 

strstr 

查找一个字符串里的子串,返回首次匹配所有子串的目标字符串中相应字符串的首地址。

模拟实现

法一:我的逻辑是能不能用strncmp负责比较字符串,用一个指针去遍历目标数组,注意结束条件为\0。但这样做有个漏洞,一次性比较多个字符串势必有越界的情况,我们以\0为突破口,能不能用它们的地址进行比较?于是思路就出现了。

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	const char* ptr = str1;
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	while (strncmp(str1, str2, len2)!=0 && str1)
	{
		if (str1 + len2 > ptr + len1)
		{
			return NULL;
		}
		str1++;
	}
	return (char*)str1;
}

法二:四指针遍历法。两指针负责移动,两指针负责记录。

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	const char* p = str1;
	const char* src = str2;

	while (*p)
	{
		str1 = p;
		str2 = src;
		while (*str1 != '\0' && *str2 != '\0' && * str1 == *str2)//注意\0
		{
			str1++;
			str2++;
		}
		if (*str2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;
}

 strtok

功能:分隔字符串,strtok函数找到str的下一个标记,并将其用\0替换,返回一个指向这个标记的指针。

注意:strtok会改变原数据的内容!一般修改临时拷贝的内容。

 

使用方法:

  • 第一个参数传字符串,第二个参数传字符串里分隔符
  • 第一个参数首次传递不为空,通过strtok函数找到指定分隔符位置后,将其替换成\0并记录下它的地址再返回回去,后面第一个参数一律为NULL(否则重置),从被保存的位置开始查找下一个分隔符所在位置。
  • 如果本次找不到分隔符,就返回NULL。

 测试:

 发现确实实现了分割并返回,但并不完全,我们可以写个循环:

strerror

功能:当函数调用失败时,将错误码(errno)转换成对应的错误信息或指向对应的地址。

perror

等价于printf + strerror函数,如需打印可以使用这个函数。

字符分类函数

int isalnum(int c):检查字符是否为数字或字母;(0~9,a~z,A~Z) 
int isalpha(int c):检查字符是否为字母;(a~z, A~Z) 
int iscntrl(int c):检查字符是否为控制字符;(八进制000~037以及177的字符) 
int isdigit(int c):检查字符是否为十进制数字;(0~9) 
int isgraph(int c):检查字符是否为图形表示,依赖于使用语言的环境;0~9,a~z,A~Z,以及标点符号) 
int islower(int c):检查字符是否为小写的字母;(a~z) 
int isprint(int c):检查字符是否为可打印的;(数字、字母、标点符号、空白字符) 
int ispunct(int c):检查字符是否为标点符号;(! ” # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~等) 
int isspace(int c):检查字符是否为空白字符;(TAB、换行、垂直TAB、换页、回车、空格) 
int isupper(int c):检查字符是否为大写字母;(A~Z) 
int isxdigit(int c):检查字符是否为十六进制数字;(0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f) 

字符转换

int tolower(int c):转化字符为小写字母; 
int toupper(int c):转化字符为大写字母;

示例:


内存函数

memcpy

功能: 将一个内存空间的数据按字节复制到另一块空间。

模拟实现 

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

	while(num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}

	return ret;
}

memmove

使用memcpy拷贝空间出现重叠时分两种情况:

memcpy显然只能从一方进行拷贝,如果出现另一种情况,则会存在内存覆盖现象。而memmove的作用就是对重叠空间进行拷贝。(有些编译器memcpy可以实现重叠拷贝)

字符串重叠空间拷贝用memmove代替strncpy。

 模拟实现

void* my_memmove(void* dest, void* src, size_t num)
{
	assert(dest);
	assert(src);
	//(char*)dest++;不能这样写,强制暂时改变了类型,void*无法自增
	void* ret = dest;
	//从前往后
	if (src > dest)
	{
		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;
}

 测试:

memcmp

内存比较函数,不多赘述。 

 memset

按字节初始化内存空间。

测试: 

 

由于小端的存储方式,我们修改前9个字节实则将前3个整形变量修改成了0。 

 

【系列06】端侧AI:构建与部署高效的本地化AI模型 第5章:模型剪枝(Pruning) 结构化剪枝移除的是模型中的整个结构,比如一个完整的神经元、一个卷积核或一个通道。修剪后的模型权重矩阵仍然是稠密的,因此能够充分利用现代硬件和软件的并行计算优势,从而显著提升推理速度。非结构化剪枝是最细粒度的剪枝方法。对于需要极致压缩但对推理速度要求不高的场景,非结构化剪枝是好的选择。它就像修剪一棵树,通过移除模型中不必要的“枝叶”,让模型变得更精简、更高效,从而适应资源受限的设备。,开发者可以方便地对模型的不同层进行剪枝,并根据需求进行微调,从而在不影响太多性能的前提下,获得一个更轻量、更高效的模型。 阅读详情

相关推荐

Spring AI + RAG 构建电商智能客服:从 PDF 文档解析到精准问答的全链路实战

核心框架:向量数据库:- PostgreSQL + pgvector (生产推荐)- Redis Stack (轻量级方案)- ChromaDB (快速原型)文档解析:- Apache PDFBox: PDF 文本提取- Spring AI Document Readers: 结构化解析大模型:- 阿里云百炼 (DashScope)- 本地部署:Qwen/ChatGLM/*** 电商领域实体*/@Data@Builder@ToString/*** 商品类型。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 379

字符串函数和内存函数

字符串函数和内存函数的使用和模拟

weixin_70764294的博客 2174

具身智能数据采集的工程化指南:从时间同步到质量校验

具身智能的模型训练离不开高质量的多模态轨迹数据,而数据采集并非简单的传感器记录。真实场景中,相机图像、机械臂关节状态与力觉信息必须在时间轴上精确对齐,标定的漂移和格式混乱会让看似正常的数据无法用于训练。时间同步与标定一致性,是决定数据质量的核心技术环节。在机器人抓取、操作等工程应用中,一套包含多传感器同步、轻量记录脚本、自动化质量校验与版本管理的数据采集流程,能大幅降低数据生产的失败率。本文从工程视角拆解具身数据采集中的典型问题,并给出可落地的流程设计与校验方法,帮助团队构建可持续迭代的高质量数据集。

weixin_30603633的博客 509

字符函数、字符串函数和内存函数

本文系统介绍了C语言中的字符函数、字符串函数和内存函数。字符函数包括字符分类函数(如islower)和字符转换函数(如toupper),用于字符类型判断和大小写转换。字符串函数涵盖字符串长度(strlen)、拷贝(strcpy)、连接(strcat)、比较(strcmp)、查找(strstr)等操作,以及安全版本(strncpy等)。内存函数包含内存拷贝(memcpy)、移动(memmove)、设置(memset)和比较(memcmp)等底层操作。文章详细讲解了每个函数的功能、使用方法和模拟实现。

qq_62473190的博客 1042

从实习生到独立上手:我是如何用海思PQTool搞定IPC图像调试的

本文分享了从实习生到独立使用海思PQTool进行IPC图像调试的成长历程。通过工具搭建、核心参数调整和实战案例,详细介绍了如何高效解决图像质量问题,特别强调了ISP调试中的关键参数和实用技巧,适合刚入门的图像调试工程师参考。

weixin_33756596的博客 311

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 364

C 语言内存函数、字符函数和字符串函数

通过上述丰富且详细的代码示例,我们已经比较全面深入地了解了 一些C 语言中内存函数、字符函数和字符串函数的使用方法及其原理。这些函数在实际编程中应用极为广泛,无论是日常的小程序开发,还是大型项目中的核心模块,都离不开它们的支持。熟练掌握这些函数,能够帮助我们更高效、更准确地处理字符串和内存操作,从而编写出更加健壮、性能更优的代码。大家在今后的编程实践中,可以不断地练习和运用这些函数,将它们融入到自己的编程思维中,以此逐步提升自己的 C 语言编程能力。

2502_90266078的博客 1248

容器化部署指南——Docker/K8s环境下的OpenClaw实践(附Dockerfile)

通过本文的详细指导,你已经掌握了OpenClaw在Docker和Kubernetes环境中的容器化部署方法。从基础镜像构建到高级部署策略,从开发环境到生产环境,你现在已经具备了完整的容器化部署能力。 容器化技术为OpenClaw提供了灵活、可扩展、可移植的部署方案,能够满足不同规模和需求的应用场景。通过合理使用Docker和Kubernetes,你可以实现高效的部署管理和运维自动化。 在实际应用中,建议根据具体的业务需求选择合适的部署策略,并结合监控、日志、安全等最佳实践,确保系统的稳定性和可靠性。同时

博客 492

c语言 字符串函数和内存函数

什么是字符串函数?从字面上理解,就是对字符串函数,那么有哪些字符串函数呢?string.hsize_t --> 无符号原理是对字符串数到\0我们就停了不再计数方法1:计数器方法2:指针-指针=元素个数方法3:递归思想。

2301_79448270的博客 237

一文速览:大模型语料构建与基础训练全流程实战指南

因为模型只有看到足够丰富、高质量的数据,才能真正学到“真本事”,展现出更强大的泛化能力,也就是能够在全新的场景和任务下,做出准确的推理和判断。我们日常做饭的时候,通常会先把买回来的菜仔细清洗干净,把坏掉的叶子、泥土、杂质等去除掉。同理,训练大模型的数据就像我们的食材,如果不干净,就会影响模型的学习效果,甚至训练出逻辑紊乱的模型。在大模型的世界里,有一句名言:“Garbage in, Garbage out”,翻译过来就是“垃圾输入,垃圾输出”,说白了,就是给模型喂的是什么数据,它学到的就是什么知识。

master_hunter的博客 1667

【我的Android进阶之旅】异常: Problems reading data from Binary store in Local\Temp\gradlexxx.bin (exist: true)

一、异常描述 今天开个会议,电脑自动关机了,重启电脑之后,打开Android Studio,编译代码,就编译失败,如下所示:异常提示 : Caused by: java.lang.RuntimeException: Problems reading data from Binary store in C:\Users\000\AppData\Local\Temp\gradle6337489649031706149.bin (exist: true) Caused by: java.lang.Runtime

字节卷动 3821

字符串函数和内存函数的使用和理解

通过这一篇内容的学习,我们要懂得并熟悉运用字符串函数strstr和strtok的功能,还有内存函数memcpy、memmove、memset、memcmp这四个的功能,其实与我们之前学过的字符函数strcpy、strcmp大同小异,而memcpy和memmove的作用可以说是几乎一样的,只不过memmove是用来处理相同元素的情况。

XU_very_NB的博客 1192

【手把手教学】YOLOv13的Dilated Reparam Block (DRB) 实现细节与优化技巧

DRB(Dilated Reparam Block)是一种创新的卷积神经网络模块,通过多分支膨胀卷积和结构重参数化技术显著提升模型性能。训练阶段使用不同膨胀率和卷积核大小的并行分支增强特征提取能力,推理阶段则将这些分支融合为单一高效的大核卷积。该方法成功解决了大核卷积的计算复杂度和训练困难等问题,在保持推理效率的同时,使模型准确率提升8.56%,mAP暴涨12.33%。DRB的核心在于训练时复杂、推理时简单的设计哲学,以及膨胀卷积的多尺度特征提取能力,为CNN性能优化提供了新的思路。

FJN110的博客 554

字符串函数和内存操作函数详解

字符串函数和内存函数的详细讲解!!!欢迎观看,谢谢!!

bang___bang_的博客 1022

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C语言】字符串函数和内存函数

🌸在我们编写C程序时,除了使用自定义函数,往往还会使用一些库函数,例如标准输入输出函数字符串函数strlen,内存函数memset等等,使用这些系统自带的库函数可以轻松地帮我们实现预期的功能,大大提升我们编程的效率。1.本期我们将介绍库里面一些常见的字符串函数以及内存函数。2.本期的目标时在学会使用这些库函数的同时了解其内部原理,并学会模拟实现相应的函数。温馨提示:可以使用目录跳转到对应函数以上我们只是将一些常见的字符串函数及内存函数进行列举分析。

忆梦初心的博客 1479

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C】字符串函数和内存函数的介绍

(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。从第一个字节开始比较,如果不相同,*ptr1大于 *ptr2时返回大于0的数字,小于时返回小于0的数字,num个字节都相同返回0.字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

bushibrnxiaohaij的博客 948

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【c语言】字符串函数和内存函数

在编程的过程中,我们经常要对字符串和内存进行各种各样的处理,c语言提供了一系列字符串函数和内存函数,便于我们对字符串或者内存空间进行操作。本篇文章我们就来学习其中的一些函数。本篇文章我们学习了字符串函数和内存函数的相关知识,它们在我们的编程当中十分常见和实用。同时,我们也学会了如何思考问题,解决问题。

2301_80955819的博客 1748
上一篇: 指针笔试题
下一篇: 自定义类型
小C您好
博客等级 码龄5年 60粉丝 60原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小C您好

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

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

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

打赏作者

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

抵扣说明:

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

余额充值