一、strtok 是啥?(一句话)
strtok = 字符串切割函数
作用:把一长串字符串,按照你指定的符号,切成一段一段的小字符串。
比如:
"LED,ON,1"
用 , 切割 → 切成
"LED" "ON" "1"
二、函数原型
char *strtok(char *str, const char *delim);
- str:要切割的原始字符串
- delim:分隔符(比如
,:\r\n) - 返回值:切出来的第一段字符串
三、最简单例子(一看就会)
#include <string.h>
#include <stdio.h>
int main()
{
char buf[] = "LED,ON,1"; // 要切割的字符串
char *token; // 存放切出来的片段
// 第一次调用:传入字符串 + 分隔符
token = strtok(buf, ",");
printf("第1段:%s\n", token); // LED
// 第二次调用:传入 NULL + 分隔符
token = strtok(NULL, ",");
printf("第2段:%s\n", token); // ON
// 第三次调用
token = strtok(NULL, ",");
printf("第3段:%s\n", token); // 1
}
输出:
第1段:LED 第2段:ON 第3段:1
四、strtok 最关键规则(必须记)
- 第一次调用:必须传入要切割的字符串
- 后面调用:必须传 NULL
传 NULL = 继续切上次剩下的字符串 - 切完了 → 返回 NULL
五、你在 STM32 里用来干嘛?
用来解析串口指令!
比如串口收到:
"LED,ON,1" "LED,OFF,2" "MOTOR,SPEED,500"
用 strtok 切割后:
- 第一段:对象(LED/MOTOR)
- 第二段:命令(ON/OFF/SPEED)
- 第三段:参数(1/2/500)
这就是你那个命令解析框架的核心!
六、strtok 超级大坑(必看!发CSDN爆款)
❌ 大坑 1:strtok会破坏原始字符串
它会把分隔符变成 \0
所以 不能传常量字符串!
strtok("LED,ON,1", ","); // ❌ 崩溃!
必须用 数组:
char buf[] = "LED,ON,1"; // ✅ 正确 strtok(buf, ",");
❌ 大坑 2:不是线程安全(不可重入)
裸机 STM32 随便用,RTOS 不要用!
❌ 大坑 3:多个连续分隔符会被当成一个
"LED,,ON" → 切成 LED 和 ON
七、你工程里的正确用法(命令解析)
char buf[] = "LED,ON,1"; char *object = strtok(buf, ","); // "LED" char *cmd = strtok(NULL, ","); // "ON" char *param = strtok(NULL, ","); // "1"
然后你就可以判断:
- if(object 是 LED)
- if(cmd 是 ON)
- 执行开灯
八、总结(适合发CSDN)
strtok 是什么?
字符串切割神器,把长串按符号切成小段。
怎么用?
- 第一次:
strtok(字符串, 分隔符) - 后续:
strtok(NULL, 分隔符) - 得到片段,处理逻辑
最重要坑
会修改原始字符串,必须用 char[],不能用常量字符串!













