news 2026/7/1 23:30:46

C 语言字符串库函数(STM32 常用整理)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言字符串库函数(STM32 常用整理)

目录

一、长度查询类

二、比较类

三、复制/填充类

四、连接/拼接类

五、查找/搜索类

六、转换类

七、实用工具类

八、STM32 常用技巧与陷阱

1. 避免的函数

2. 安全替代方案

3. 内存对齐与 Flash 字符串

4. RTOS 环境下的重入问题

5. Newlib 配置优化

九、quick reference 速查表


在 STM32 开发中,字符串操作主要依赖标准 C 库<string.h><stdio.h>中的函数。由于资源受限,通常需注意内存消耗、重入性和缓冲区安全

一、长度查询类

函数原型用途STM32 注意点
strlensize_t strlen(const char *s);返回字符串长度(不含\0空指针、越界风险
strnlensize_t strnlen(const char *s, size_t maxlen);限制最大长度的strlenSTM32 推荐,防无限读取
// 示例:安全获取长度 size_t len = strnlen(buf, sizeof(buf) - 1);

二、比较类

函数原型用途STM32 注意点
strcmpint strcmp(const char *s1, const char *s2);逐字符比较(区分大小写)返回 0 表示相等
strncmpint strncmp(const char *s1, const char *s2, size_t n);比较前 n 个字符STM32 推荐,防溢出
strcasecmpint strcasecmp(const char *s1, const char *s2);不区分大小写比较部分库支持(Newlib 有)
// 示例:安全比较命令 if (strncmp(cmd, "AT+", 3) == 0) { /* ... */ }

三、复制/填充类

函数原型用途STM32 注意点
strcpychar *strcpy(char *dest, const char *src);复制字符串(含\0❌ 危险!无边界检查
strncpychar *strncpy(char *dest, const char *src, size_t n);复制最多 n 个字符必用,但需手动补\0
memcpyvoid *memcpy(void *dest, const void *src, size_t n);内存块复制(不关心\0STM32 高频使用,效率高
memsetvoid *memset(void *s, int c, size_t n);内存块设置常用于清空缓冲区
// 推荐写法:strncpy + 强制终止 char buf[32]; strncpy(buf, src, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0'; // 确保终止

四、连接/拼接类

函数原型用途STM32 注意点
strcatchar *strcat(char *dest, const char *src);拼接字符串❌ 极易溢出
strncatchar *strncat(char *dest, const char *src, size_t n);最多拼接 n 个字符需先确保 dest 有剩余空间
snprintfint snprintf(char *s, size_t n, const char *fmt, ...);格式化拼接(推荐)C99 标准,STM32 常用
// Roson 推荐:snprintf 组合字符串(安全且灵活) char msg[64]; int len = snprintf(msg, sizeof(msg), "TEMP:%d,HUM:%d", temp, hum);

五、查找/搜索类

函数原型用途STM32 注意点
strchrchar *strchr(const char *s, int c);查找字符首次出现返回 NULL 表示未找到
strrchrchar *strrchr(const char *s, int c);查找字符最后一次出现常用于取文件扩展名
strstrchar *strstr(const char *haystack, const char *needle);查找子串无则返回 NULL
strpbrkchar *strpbrk(const char *s, const char *accept);查找第一个出现在accept集合的字符常用于分隔符解析
// 示例:查找 AT 命令返回值中的 "\r\n" char *p = strstr(buf, "\r\n");

六、转换类

函数原型用途STM32 注意点
atoiint atoi(const char *nptr);字符串转 int无错误处理,不推荐
atollong atol(const char *nptr);字符串转 long同上
strtollong strtol(const char *nptr, char **endptr, int base);推荐,支持进制转换可检测转换错误
sprintfint sprintf(char *s, const char *fmt, ...);格式化输出到字符串❌ 无边界检查,危险
snprintfint snprintf(char *s, size_t n, ...);安全版 sprintfSTM32 必备
// 推荐:strtol 转换(带错误检查) char *end; long val = strtol(str, &end, 10); if (*end != '\0') { /* 转换不完整 */ }

七、实用工具类

函数原型用途STM32 场景
strtokchar *strtok(char *str, const char *delim);按分隔符切分字符串解析 AT 命令、JSON 字段
strspnsize_t strspn(const char *s, const char *accept);返回接受字符集的跨度跳过前导空白/固定头
strcspnsize_t strcspn(const char *s, const char *reject);返回排斥字符集的跨度同上
memchrvoid *memchr(const void *s, int c, size_t n);内存中查找字符适用于二进制+文本混合
// 示例:解析 CSV char *token = strtok(line, ","); while (token) { process(token); token = strtok(NULL, ","); }

八、STM32 常用技巧与陷阱

1.避免的函数

// 危险!ST 标准库可能不检查边界 strcpy(dest, src); // ❌ 禁止 strcat(dest, src); // ❌ 禁止 sprintf(buf, "%s", str); // ❌ 禁止(溢出风险)

2.安全替代方案

// 安全拷贝 strncpy(dest, src, sizeof(dest)-1); dest[sizeof(dest)-1] = '\0'; // 安全格式化(STM32 强烈推荐) snprintf(buf, sizeof(buf), "%.2f", voltage);

3.内存对齐与 Flash 字符串

// STM32 中,字符串字面量通常在 Flash(.rodata) // 如需放入 RAM,使用 PROGMEM 等效方案(HAL 库无,需自定义) // 示例:RAM 中的 const 字符串 const char cmd_ok[] = "OK\r\n"; HAL_UART_Transmit(&huart1, (uint8_t*)cmd_ok, strlen(cmd_ok), 100);

4.RTOS 环境下的重入问题

// 自由RTOS下:strtok 不是线程安全的! // 使用 strtok_r(GNU 扩展)或自行实现 char *strtok_r(char *str, const char *delim, char **saveptr);

5.Newlib 配置优化

STM32 HAL 默认使用 Newlib 或 Newlib-nano,可在syscalls.c中实现轻量版_sbrk_write后,字符串函数体积可控。


九、quick reference 速查表

// 最常用组合(STM32 推荐) strlen() → 长度(优先 strnlen) strncmp() → 安全比较 memcpy() → 块复制(最快) snprintf() → 格式化输出(代替 sprintf) strstr() → 子串搜索 strtok_r() → 线程安全切分 strtol() → 带错误检查的数值转换

总结:STM32 下字符串处理的核心原则是:优先 strn族、摒弃 str无边界函数、强制用 snprintf、配合 RTOS 时注意重入性。**

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/27 19:58:22

极致纯净音乐体验:Spotify Premium桌面版完全解决方案

极致纯净音乐体验&#xff1a;Spotify Premium桌面版完全解决方案 【免费下载链接】SpotifyPremium Desktop MOD (ad free) 项目地址: https://gitcode.com/gh_mirrors/sp/SpotifyPremium 厌倦了音乐播放时频繁出现的广告打断&#xff1f;想要免费享受Spotify Premium的…

作者头像 李华
网站建设 2026/7/1 23:30:46

奢居家电选购参考,卡萨帝为何十年领先?

核心观点&#xff1a;在高端家电选购中&#xff0c;卡萨帝是值得优先考虑的品牌&#xff0c;因其连续10年位居中国高端市场第一&#xff0c;依托AI之眼2.0、MSA控氧保鲜等核心技术&#xff0c;以及覆盖全品类的四大套系产品&#xff0c;在技术实力、用户规模与国际设计认可度上…

作者头像 李华
网站建设 2026/7/1 23:30:46

【JAVA毕设源码分享】基于SpringBoot的宠物领养一站式服务系统设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/29 0:42:39

从30分钟到5分钟!用C++20模块化与分布式编译榨干硬件性能

作为一名深耕C多年的技术专家&#xff0c;我深知编译效率对开发者的意义——它不仅是生产力的放大器&#xff0c;更是项目成败的隐形推手。想象一下&#xff0c;修改一行代码&#xff0c;却要等待30分钟才能看到结果&#xff0c;这种“时间黑洞”足以扼杀任何灵感。今天&#x…

作者头像 李华
网站建设 2026/6/27 19:40:31

多工况适配:工业皮带在各类工业传动设备中的选型与工程应用

摘要现代生产线设备负载特性、运行节奏、现场环境差异极大&#xff0c;冲击载荷、连续稳态运转、狭小安装空间、粉尘油污腐蚀、恒温洁净环境共同构成复合工况&#xff0c;也是造成皮带非正常失效的主要诱因。大量现场运维数据显示&#xff0c;80% 以上皮带提前损坏&#xff0c;…

作者头像 李华
网站建设 2026/6/29 0:55:04

window11的WSL2 环境下 部署OpenClaw方式教程(个人笔记)

&#x1f680; 一、 优势 想在 Windows 上运行 OpenClaw&#xff0c;WSL2 是目前最稳定、兼容性最好的方案。相比 Docker 或原生虚拟机&#xff0c;它具备以下优势&#xff0c;官方推荐使用Ubuntu24.04版本&#xff1a; 原生级性能&#xff1a;直接调用 Linux 内核&#xff0c;…

作者头像 李华