STM32串口中常用的字符函数strlen,strcmp,strstr详解及具体程序实现过程

编写STM32 C程序:字符串String转数字, 数字转字符串String 一 数字类型与字符串类型 在做嵌入式C程序开发中,如果通信协议采用字符串方式来交互数据,比如使用到AT指令格式,或者需要GUI界面的显示,那么就会经常用到数字类型与字符串类型的转换。在C语言标准库stdlib中提供了多个字符串与数字类型的转换函数,丰富的转换功能能够满足绝大多数的需求,方便了C语言的开发。 1.1、数字类型 多个数据在内存中是连续存储的,彼此之间没有明显的界限,如果不明确指明数据的长度,计算机就不知道何时存取结束。因此,C语言的数据类型就是明确指明了当前数据的长度信息。 C语言.. 阅读详情
AI摘要

本文详细介绍了STM32开发中常用的C语言库函数strlen()、strcmp()和strstr(),包括它们的参数、返回值、实现逻辑以及示例应用,帮助开发者理解和使用这些字符串处理函数。,

STM32中 strlen(),strcmp(),strstr() 是我们在使用串口的时候,经常会用到的C语言库<string.h>里的字符串函数,用来对串口接受过来的数据进行一个判断处理。

求字符串长度函数 strlen()

函数介绍

在这里插入图片描述


传入参数:数组的首元素地址。
返回值:  返回 '\0'之前所有字符个数 数据 类型为size_t无符号整形。

函数使用

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[20] ="hello";
	int ret=strlen(arr);
    printf("%d\n", ret);
	return 0;
}

运行结果:
在这里插入图片描述

函数实现逻辑

通过上面函数的返回值,我们可以得知 ‘\0’ 是函数的结束条件,此外 ‘\0’ 是编译器主动加在每一个字符串结尾加上的。
在这里插入图片描述在这里插入图片描述
这样逻辑就简单了,只需要一个while循环一直判断是否遇到 ‘\0’ 就可以了,如果没遇到 '\0’就一直向后走,遇到了就退出循环并返回统计的值。

函数实现·

size_t my_srtlen(const char * str1)// const 将变量修饰为常量,保证传入的数据的内容不会被修改
{
	size_t count = 0;
	while (*str1++ != '\0')
	{
		count++;
	}
	return count;
}

函数实例

#include <stdio.h>
#include <string.h>
size_t my_srtlen(const char * str1)
{
	size_t count = 0;
	while (*str1++ != '\0')
	{
		count++;
	}
	return count;
}

int main()
{
	char arr[20] ="hello";
	int ret= my_srtlen(arr);
    printf("%d\n", ret);
	return 0;
}

字符串比较函数 strcmp()

函数介绍

在这里插入图片描述


传入参数:两个要比较字符串数组的首元素地址。
返回值:  
           str1>str2 返回大于0的数
           str1=str2 返回0
           str1<str2 返回小于0的数
  字符之间比较的是ASCII码之间的大小。

函数使用

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] ="afc";
	char arr1[] = "abc";
	int ret= strcmp(arr,arr1);
    printf("%d\n", ret);
	return 0;
}

函数实现逻辑

通过上面传入参数和返回值,可以知道需要while循环来不断的遍历这两个数组的所有元素,直到遇见 ‘\0’ 相等就退出循环并返回0,并且在循环里会不断判断出两个字符之间的大于或小于,那就返回相应的正负值。
在这里插入图片描述但是在写的过程中,我们会发现我们可以把两个数组里元素是否相等做为循环判断条件,如果所有的元素都相等那么就一直向后走,直到遇到 ‘\0’ 就退出函数并返回0 ,如果不相等就会退出循环返回两个元素相减的值,这样就显得代码更加简洁高效。

函数实现·

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

函数实例

#include <stdio.h>
#include <string.h>
int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char arr[] ="afc";
	char arr1[] = "abc";
	int ret= my_strcmp(arr,arr1);
    printf("%d\n", ret);
	return 0;
}

查找子字符串函数 strstr()

函数介绍

在这里插入图片描述


传入参数:
    str1:指向一个字符串,从此字符串中查找 str2子串。
    str2 : 要查找的子串。
返回值:  
    如果找到子串,则该函数返回一个指向子串第一次出现的位置;反之,如果未在str1字符串中找到子串,则返回 NULL。

函数使用

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] ="aaabccc";
	char arr1[] = "bc";
    printf("%s\n", strstr(arr, arr1));
	return 0;
}

函数实现逻辑

创建三个字符常量指针,第一个 temp是用来存储子字符串首次出现在主字符串的地址,第一个while循环是为了不断的通过temp++;遍历主字符串,如果直到遇到’\0’还没有匹配到子字符串的话,就说明没有找到返回NULL,sr1 = temp; 是保证在匹配不完全成功的情况下还能回到最开始匹配上的后一位,从后一位再开始重新匹配,sr2 = str2;也同样是为了保证在不完全匹配成功的时候,能退回来找到子字符串首元素的位置,重新开始匹配,第二个while循环是不断的判断主字符串和子字符串是否匹配如果匹配就向后移动一位,并且两个的值不能为’\0’,当sr2的值为’\0’是说明匹配成功返回首次匹配的地址temp。

函数实现

const char* my_strstr(const char *str1,const char *str2)
{
	assert(str1&&str2);
	const char* temp=str1;
	const char* sr1 = str1;
	const char* sr2 = str2;
	if (*str2 == '\0')
		return str1;
	while(*temp)
	{ 
		sr1 = temp;
		sr2 = str2;
		while (*sr1==*sr2&&*sr1 !='\0' && *sr2 != '\0')
		{
			sr1++;
			sr2++;
		}
		if (*sr2 == '\0')
			return  temp;
		temp++;
	}
	return NULL;
}

函数实例

#include <stdio.h>
#include <string.h>
const char* my_strstr(const char *str1,const char *str2)
{
	assert(str1&&str2);
	const char* temp=str1;
	const char* sr1 = str1;
	const char* sr2 = str2;
	if (*str2 == '\0')
		return str1;
	while(*temp)
	{ 
		sr1 = temp;
		sr2 = str2;
		while (*sr1==*sr2&&*sr1 !='\0' && *sr2 != '\0')
		{
			sr1++;
			sr2++;
		}
		if (*sr2 == '\0')
			return  temp;
		temp++;
	}
	return NULL;
}
int main()
{
	char arr[] ="aaabccc";
	char arr1[] = "bc";
    printf("%s\n", my_strstr(arr, arr1));
	return 0;
}
关于Stm32串口输出模仿printf编写的函数方法(野火stm32F103指南者板适用) 我在Stm32串口编程中遇到的一些很有用的函数 下面的这几个函数和测试是我在Stm32串口编程中遇到的一些对新人极不友好 的函数,但是学会之后非常的好用!!写好一次,以后可以直接复制粘贴了!! 再说一遍,这几个函数主要是围绕串口输出的哦。 最后一部分是我自己编写的输出函数,模仿printf就直接输出了,虽然也可以函数重定向,但是重定向不如这种方式灵活。 串口初始化就直接跳过,例程网上非常丰富。 1、va_list va_start(ap, variable) va_arg(ap, type) va_end( 阅读详情

相关推荐

基于STM32激光雷达的使用

这篇文章是基于STM32407ZGT6使用FYDLIDAR SDM15激光测距模块进行距离测量的文章。

weixin_74157522的博客 5088

STM32——C语言基础

C语言基础

asdf1234dfty的博客 4953

C语言字符串函数深度解析:从安全使用到高效编程实践

在C语言编程中,字符串处理是基础且关键的技术环节。字符串本质上是以空字符'\0'结尾的字符数组,其操作直接涉及内存管理与数据安全。标准库提供的字符串函数,如strcpy、strcat、strcmp等,是实现字符串操作的核心工具,理解其底层原理对于编写稳健代码至关重要。这些函数的高效使用能提升程序性能,而错误使用则可能导致缓冲区溢出等严重安全漏洞。在实际开发中,尤其是在嵌入式系统和资源受限环境下,掌握字符串函数的安全实践与性能优化技巧,是保障代码质量的关键。本文聚焦于C语言字符串函数的核心机制、常见陷阱及解决

weixin_30315435的博客 375

比较实用的三个字符串处理函数(STM32串口)

如果有漏洞,请大家留言继续修改 /* //函数名称:复制字符串 //参数:dest字符串容器,str被复制字符串,count复制长度 //返回值:无 // */ void my_strncpy(u8 *dest, u8 *src, int count)   {       u8 *tmp = dest;       while(count) {           if ((

花园王国---Garden kingdom 2万+

STM32+ESP8266 接入阿里云飞燕平台:3步完成MQTT连接与数据上报

本文详细介绍了如何使用STM32微控制器配合ESP8266 WiFi模块接入阿里云飞燕平台,实现MQTT通信与数据上报。通过硬件连接、平台配置、WiFi连接实现、MQTT协议处理等步骤,帮助开发者快速构建物联网设备与云平台的安全可靠连接。

weixin_34214500的博客 449

STM32+Air780E按键中文短信发送与OLED显示实战

在物联网设备远程通信中,串口AT指令是主控芯片与无线模块交互的标准化途径。STM32作为广泛应用的嵌入式主控,通过UART连接Air780E 4G模块,结合PDU编码将中文内容转换为UCS2字节流,即可实现稳定的短信发送功能。同时,OLED屏幕作为人机交互界面,能够实时反馈按键状态与发送结果。这种设计模式不仅适用于按键触发短信,还可扩展到传感器阈值报警、设备状态上报等工业场景。围绕AT指令时序、PDU格式组装、按键消抖及OLED中文取模等关键技术,整个流程从事件检测到编码发送再到状态反馈,形成一套可复用的嵌

weixin_33834137的博客 385

C语言string.h库函数深度解析:从原理到嵌入式实战应用

字符串处理是编程的基础,其核心在于对内存中字符序列的高效操作与安全控制。C语言标准库中的string.h提供了一系列底层函数,如strcpy、strcat和memcpy等,它们直接操作内存,性能高效,是系统编程和嵌入式开发的基石。理解这些函数的实现原理,例如strcpy的缓冲区溢出风险、strncpy的终止符陷阱以及memcpy与memmove在处理内存重叠时的区别,对于编写健壮、安全的代码至关重要。在嵌入式开发中,尤其是在资源受限的STM32等平台,掌握这些函数的定制化实现和优化策略(如对齐访问、使用编译

weixin_34080571的博客 376

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 221

【C语言】字符串函数和内存函数的使用及其模拟实现

C语言string.h中的库函数解析(字符串函数和内存函数)

学了就忘是正常现象 1550

统计滤波器

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对统计滤波器做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1644

第25节:cesium 地形开挖综合实例-地下管网(含源码+视频)

地图开挖综合示例,包括底图切换,绘制开挖区域,移除开挖区域,影藏地图等等。

qq_29384639的博客 1782

C语言字符串函数深度解析:从内存模型到安全编程实战

在C语言编程中,字符串处理是基础且核心的操作,其本质是以空字符'\0'结尾的字符数组。理解这一内存模型是掌握字符串函数的关键,它直接关系到程序的正确性与安全性。由于C标准库的经典字符串函数(如strcpy、strcat)多为“无界”操作,不检查目标缓冲区大小,极易引发缓冲区溢出这一严重的安全漏洞和程序崩溃根源。因此,在现代工程实践中,掌握安全编程范式至关重要,例如使用strncpy、snprintf等有界函数替代,并始终明确字符串的逻辑长度与缓冲区的物理容量。这些技术对于嵌入式开发、系统编程等资源受限或高性

weixin_33794672的博客 393

在 Eclipse 中接入 DeepSeek:开启 Java 开发新效率

DeepSeek 能够根据自然语言描述,精准生成高质量的 Java 代码片段。无论是简单的方法编写,比如 “编写一个 Java 方法,用于计算两个整数的乘积”,还是复杂的类和功能模块创建,例如 “创建一个 Java 类,实现文件的读写操作,并包含异常处理机制”,它都能快速给出合理且可运行的代码示例。DeepSeek 生成的代码不仅实现了基本功能,还遵循 Java 的编码规范,添加了必要的注释,让代码更易于理解和维护,大大节省了开发者从头编写代码的时间和精力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4068

ESP8266 字符串操作函数详解

ESP8266字符串API int os_sprintf( char *buffer, const char * format, [ argument ] … ) 把格式化的数据写入某个字符串缓冲区 buffer:char型指针,指向将要写入的字符串的缓冲区。 format:格式化字符串。 [argument]...:可选参数,可以是任何类型的数据。【若是字符串,结束字符‘\0’不写入】 返回值X...

weixin_42124890的博客 3697

通信算法之283:大疆DJI云哨系统-DJI DroneID物理层协议-解速率匹配及Turbo译码

3. 完整云哨接收机,接收灵敏度。交流: 1279682290 ,2. Turbo译码模块。1. 解速率匹配模块。

leegang12的专栏 868

【SpringBoot 3.x 第56节】再见 Feign?原生 HTTP 接口强势上位,这才是微服务调用的正确姿势!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1017

C语言字符串函数底层原理与ARM64内存安全实践

字符串操作函数是C语言内存管理的核心入口,其本质是字节级内存读写行为的封装。理解strcpy、strncpy、strcat等函数的边界判定逻辑、空终止机制与缓冲区约束,是防范缓冲区溢出、栈破坏等安全问题的基础。在ARM64架构下,这些函数的汇编实现直接受NEON向量指令、地址对齐要求和调用约定影响,memcpy的向量化优化与strstr的算法选择更体现性能与安全的权衡。本文聚焦内存意图建模、边界陷阱识别及Aarch64平台适配,覆盖嵌入式固件开发、Linux内核模块编写与MCU资源受限场景下的工程落地要点。

weixin_30444105的博客 322

2020年大连理工大学《计算机控制技术》期末试卷

2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 ...

无名何许人的博客 650

<string.h>中常用的库函数

1.strlen 原型:unsigned int strlen(char *str); 功能:计算并返回一个字符串的长度。在计算字符串长度时,没有把字符串结束符(\0)计算在内。 strlen只能用于计算字符串的长度,不能用于计算各种类型的数组长度。 2.strcmp 原型:int strcmp( const char *str1, const char *str2); eg: char *str1, *str2; if(strcmp(str1,str2)<0) ... else

shine的博客 1080

新手必看!一步步教您如何获取可用的D音Cookie(为什么我复制的D音Cookie无法正常使用?)

新手必看!一步步教您如何获取可用的抖音Cookie(为什么我复制的抖音Cookie无法正常使用,无法下载无水印视频?)

XiaoqiangClub的博客 1491

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

手写C字符串函数:从strlen到strncpy的底层实现与内存原理

字符串操作是C语言内存编程的基石,其本质是基于指针的字节序列遍历与复制。理解strlen、strcpy、strcat、strcmp和strncpy等函数的底层原理,关键在于掌握空字符\0的终止机制、指针地址运算、以及目标缓冲区边界控制。这些函数不依赖高级抽象,而是直接作用于内存地址,因此极易引发缓冲区溢出、未终止字符串、符号截断等典型安全问题。在嵌入式开发、系统编程及校招笔试中,手写实现不仅是考察基础能力的标尺,更是建立对内存布局、类型安全与防御性编程的深度认知路径。本文聚焦这五个核心函数的手动实现与调试验

weixin_34162228的博客 359

ssm框架搭建

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

string.h的部分函数使用及模拟实现

strlen strcpy strncpy strcat strncat strcmp strncmp strstr strtok strerror perror memcpy memmove memcmp memset

m0_64238771的博客 509

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言标准库函数深度解析:常用函数的细节与工程实践

C语言作为基础编程语言,标准库函数是每位开发者绕不开的工具集。正确理解库函数的行为边界,比死记硬背函数列表更重要。字符串处理函数如strlen、strcpy、fgets都存在容易被忽略的返回值与终止符陷阱,格式化输入输出中的类型匹配更是未定义行为的重灾区。内存管理函数malloc、calloc、realloc在堆与栈的交互中隐藏着指针与容量的深层逻辑,而文件读写与fopen模式的选择则直接影响程序稳定性。从通用概念到底层原理,再到实际工程中的技术价值,函数细节决定程序健壮性。无论是嵌入式开发还是桌面应用,掌

weixin_33462167的博客 209

STM32与LTE Cat 1模块的工业物联网通信方案

物联网通信技术在现代工业自动化中扮演着关键角色,其核心在于实现设备间的稳定数据传输。基于TCP/IP协议栈的无线通信模块配合微控制器,能够构建可靠的工业级物联网终端。本文以STM32F745ZG微控制器与u-blox LARA-R6401D-00B LTE Cat 1通信模块的组合为例,详细解析硬件接口设计、驱动开发和安全通信实现。该方案特别适用于需要宽温工作范围(-40°C至+85°C)和工业级可靠性的场景,如远程监控和智能电表等应用。通过多级心跳机制、端到端加密和低功耗优化等关键技术,可确保在恶劣环境下

weixin_33997389的博客 331

基于STM32的家庭环境监测系统实战设计

家庭环境监测系统是嵌入式物联网的典型落地场景,其核心在于传感器数据采集、本地人机交互、稳定无线上传与断网容灾能力的有机统一。原理上需兼顾确定性实时响应(如STM32中断低延迟)与通信鲁棒性(如ESP8266透传+主控连接管理),技术价值体现在高可靠性、低功耗与量产可行性。广泛应用于智能家居、儿童房监护、厨房空气质量监控等真实家庭场景。本文以STM32F103C8T6为主控,结合OLED本地交互与机智云轻量接入,提供可部署、可扩展、经72小时压力验证的完整工程方案。

weixin_34130389的博客 400

基于STM32的智能宠物屋DIY:低成本本地化物联网项目实践

嵌入式系统与物联网技术通过将物理世界与数字世界连接,实现了设备的智能化与自动化。其核心原理在于利用微控制器(如STM32)作为大脑,通过传感器采集环境数据,经由执行器做出响应,并结合通信模块实现信息交互。这种技术架构在智能家居、环境监控等领域具有广泛的应用价值。本文聚焦于一个典型的物联网应用场景——智能宠物屋,详细阐述了如何利用**STM32F103**单片机和**ESP8266** WiFi模块,构建一个集环境监测、自动喂食与本地监控于一体的低成本、本地化解决方案。项目涵盖了从硬件选型、电路设计到驱动开发

weixin_34332905的博客 299
上一篇: 通俗易懂的C语言指针知识讲解(详细,深入) 1
下一篇: C语言 浮点数和整数在内存中的存储 (详解)
星于月与我
博客等级 码龄5年 6粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值