Парсер POST запроса - C (СИ)
Формулировка задачи:
Добрый вечер. Возникла небольшая запинка с парсингом строки. Имеемтся POST запрос такого вида:
Нужно выдернуть все значения и записать их в массив. Делаю так:
Все работает нормально вплоть до последней записи. После выделения последней лексемы и записи в массив еще раз попадаю в цикл и в буфер пишется мусор, т.е. на выходе в массиве получется:
Думаю ошибка элементарная, но пока не нашел ее.
P.S. Использовать готовые библиотеки для парсинга не представляю возможным, т.к. код пишу для микроконтроллера.
list_value=str_value1&list_value=str_value2&list_value=str_value3
void parse(char *post_req) { char *p; char test[256]; int offset = 0; memset(test, 0, 256); p = strtok(post_req, "&"); strcpy(test, p+11); offset = strlen(p) - 10; // strlen(list_value=) + 1 отступ перед следующей записью while (p != NULL) { p = strtok (NULL, "&"); strcpy(test+offset, p+11); offset += strlen(p) - 10; } }
str_value100str_value200str_value300blablablablabla00
Решение задачи: «Парсер POST запроса»
textual
Листинг программы
while (p != NULL) { if (p = strtok (NULL, "&")) { strcpy(test+offset, p+11); offset += strlen(p) - 10; } }
Объяснение кода листинга программы
- Входные данные:
- p - указатель на строку, которая содержит параметры запроса в формате URL
- test - указатель на строку, в которую будут копироваться значения параметров
- offset - смещение в строке test, от которого начинается копирование следующего параметра
- Создается цикл while, который выполняется до тех пор, пока p не станет равным NULL
- Внутри цикла проверяется, является ли p равным NULL. Если это не так, то выполняется следующий блок кода.
- В этом блоке кода используется функция strtok для разделения строки запроса на отдельные параметры, разделенные символом
&
. Функция strtok возвращает указатель на первый параметр (p), а в качестве разделителя указывает пустую строку ``. - Если p не равен NULL (то есть был найден параметр), то выполняется следующий блок кода.
- В этом блоке кода происходит копирование значения параметра в строку test, начиная с offset. При этом из значения параметра удаляется префикс
p=
, который состоит из символаp
и пробела. - После копирования значения параметра выполняется увеличение offset на длину copied (значение параметра без префикса) - 10 (длина префикса
p=
). Это позволяет сдвинуть указатель test на следующую позицию, чтобы начать копирование следующего параметра. - После выполнения всех итераций цикла while, в строке test будут содержаться значения всех параметров запроса, разделенные пробелами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д