ESP32中如何移除OBD适配器返回buffer里首次出现的"43 "
如何从ESP32的buffer中移除首次出现的"43 "字符?
我在ESP32上编写了一段获取OBD适配器命令返回值的代码,目标是从buffer中移除首次出现的3个字符"43 ",但当前代码逻辑未达成预期。
现有代码
if (receive(buffer, sizeof(buffer)) > 0) { char *p = buffer; Serial.print("3 - p:"); Serial.println(p); Serial.print("31 - size of p : "); Serial.println(strlen(p)); p = strstr(p, "43 "); Serial.print("32 - p:"); Serial.println(p); }
当前串口输出
3 - p:43 01 33 03 01 00 00 > 31 - size of p : 23 32 - p:43 01 33 03 01 00 00 > 33 - size of p : 23
解决方案
问题出在strstr(p, "43 ")返回的是原buffer的起始指针(因为字符串开头就是"43 "),直接赋值给p不会改变指向的内容。根据需求提供两种实现方式:
方式1:仅调整指针(不修改原buffer)
如果只是后续处理需要使用移除"43 "后的字符串,不需要修改原buffer内容,直接让指针跳过目标字符即可:
if (receive(buffer, sizeof(buffer)) > 0) { char *p = buffer; Serial.print("3 - p:"); Serial.println(p); Serial.print("31 - size of p : "); Serial.println(strlen(p)); char *found = strstr(p, "43 "); if (found != NULL) { // 跳过"43 "三个字符 p = found + 3; Serial.print("32 - p:"); Serial.println(p); Serial.print("33 - size of p : "); Serial.println(strlen(p)); } }
方式2:修改原buffer(真正移除字符)
如果需要让原buffer直接存储移除"43 "后的内容,可以用memmove将后续字符前移覆盖目标字符:
if (receive(buffer, sizeof(buffer)) > 0) { char *p = buffer; Serial.print("3 - p:"); Serial.println(p); size_t original_len = strlen(p); Serial.print("31 - size of p : "); Serial.println(original_len); char *found = strstr(p, "43 "); if (found != NULL) { // 计算需要移动的字符长度(包含末尾的终止符'\0') size_t move_len = original_len - (found - p) - 3 + 1; // 前移覆盖"43 " memmove(found, found + 3, move_len); Serial.print("32 - p:"); Serial.println(buffer); Serial.print("33 - size of p : "); Serial.println(strlen(buffer)); } }
注意事项
- 确保
buffer是可修改的字符数组,且有足够空间存储内容; - 若"43 "出现在字符串末尾,需额外处理边界情况,但你的场景中它位于开头,无需担心。
内容的提问来源于stack exchange,提问作者lucian_v
相关产品推荐
相关产品推荐

