'C' получает длину подстроки из большого буфера, используя strstr() и вычитая два указателя
У меня есть круговой буфер текста ASCII длиной 1000 байтов. Он будет постоянно обновляться и дополняться.
Моя проблема в том, что я использую strstr(), чтобы точно определить, где начинается часть данных с поиска "$GPRMC", и я ищу "\r\n", чтобы указать конец этого блока. Длина будет переменной, и мне нужно найти способ определить длину каждого блока данных (строковых данных), чтобы я мог затем проанализировать его и сохранить в переменной и т. Д.
Я попытался вычесть два указателя, возвращенных из strstr(), но получил число wayyyyy к большому (оно превысило 6 миллиардов), но на самом деле длина строк составляет 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;
1 ответ
Вы не можете использовать strstr
с круговым буфером, потому что он не знает, где обернуть. Рассмотрим эту схему буфера:
o , w o r l d ! . . H e l l
^ ^
| |
end--+ +- start
Ваша программа не сможет найти Hello
потому что это конец до его начала. Поэтому вам нужно написать свой собственный circ_strstr
это берет буфер вместе с его длиной в дополнение к начальной позиции и строке поиска.
У вашей программы тоже будут проблемы с линейным буфером, потому что она может найти \r\n
из предыдущего токена. Вам необходимо начать поиск закрывающего токена с позиции после точки, где был найден начальный токен. В противном случае ваш end
может быть меньше data
, так что вычитание приведет к отрицательному числу (которое будет интерпретировано как огромное значение без знака).