我有一个长度为1000字节的ASCII文本循环缓冲区。它将不断更新并附加到。
我的问题是我使用strstr()通过查找“$ GPRMC”来查明数据的一部分开始,我正在寻找一个“\ r \ n”来表示该块的结束。长度是可变的,我需要找到一种方法来确定每个数据块的长度(字符串数据),这样我就可以进一步解析它并将其存储到变量等中。
我尝试减去从strstr()返回的两个指针,但得到了一个数字wayyyyy到大(它超过60亿)但实际上字符串长度相差60-80个字符。
char *data, *end;
int diff;
data = strstr(&gps_buffer[gps_head], "$GPRMC");
end = strstr(&gps_buffer[gps_head], "\r\n");
diff = end - data;
答案 0 :(得分:2)
您不能将strstr
与循环缓冲区一起使用,因为它不知道环绕的位置。考虑这个缓冲区布局:
o , w o r l d ! . . H e l l
^ ^
| |
end--+ +- start
您的程序无法找到Hello
,因为它的结尾是之前的。因此,除了初始位置和搜索字符串之外,您还需要编写自己的circ_strstr
,其中包含缓冲区及其长度。
您的程序也会遇到线性缓冲区问题,因为它可以从前一个标记中找到\r\n
。您需要从找到初始标记的位置之后的位置开始搜索结束标记。否则,您的end
可能会小于data
,因此减去会产生一个负数(将被重新解释为一个巨大的无符号值)。