'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, так что вычитание приведет к отрицательному числу (которое будет интерпретировано как огромное значение без знака).

Другие вопросы по тегам