嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)
2023-12-24 05:57:35
受到以下博文的启发:
https://www.cnblogs.com/yup1983/p/11337837.html
验证:
最近通过ESP8266远程控制小车,在wifi回传的数据解析过程中遇到标题所述的烦恼
如上截图所示,数据回传过程中会接受到‘\0’字节对应的ASCII码为0x00,这就是问题的关键因素。
再看一下strstr()函数的源码:
char* My_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*p!='\0')
{
s1 =p ;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (s2 == '\0')
{
return (char*)p;
}
p++;
}
return NULL;
}
在源码中可以看到,strstr()函数在轮询判断的时候,首先会判断while (*s1 != ‘\0’ && *s2 != ‘\0’ && *s1 == *s2),即在函数未返回之前,str1和str2中只要出现‘0x00’也就是‘\0’就会终止判断,从而退出,导致意想不到的效果。
对比上面一张截图即可发现答案
判断代码如下:
void WIFI_Conformation(char* str,Dir* dir)
{
printf("-----WIFI数据解析------\r\n");
if(strstr("readString: {\"button_up\":\"tap\"}","button"))
{
printf("strstr 能用\r\n");
}
if(strstr(str,"up"))
{
dir->up=1;
printf("\r\n----up----\r\n");
}
else if(strstr(str,"down"))
{
dir->down=1;
printf("\r\n----down----\r\n");
}
else if(strstr(str,"left"))
{
dir->left=1;
printf("\r\n----left----\r\n");
}
else if(strstr(str,"right"))
{
dir->right=1;
printf("\r\n----right----\r\n");
}
else;
}
文章来源:https://blog.csdn.net/weixin_52477295/article/details/135177210
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!