Парсер POST запроса - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Возникла небольшая запинка с парсингом строки. Имеемтся POST запрос такого вида:
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
Думаю ошибка элементарная, но пока не нашел ее. P.S. Использовать готовые библиотеки для парсинга не представляю возможным, т.к. код пишу для микроконтроллера.

Решение задачи: «Парсер POST запроса»

textual
Листинг программы
while (p != NULL)
    {
        if (p = strtok (NULL, "&"))
        {
            strcpy(test+offset, p+11);
            offset += strlen(p) - 10;
        }
    }

Объяснение кода листинга программы

  1. Входные данные:
    • p - указатель на строку, которая содержит параметры запроса в формате URL
    • test - указатель на строку, в которую будут копироваться значения параметров
    • offset - смещение в строке test, от которого начинается копирование следующего параметра
  2. Создается цикл while, который выполняется до тех пор, пока p не станет равным NULL
  3. Внутри цикла проверяется, является ли p равным NULL. Если это не так, то выполняется следующий блок кода.
  4. В этом блоке кода используется функция strtok для разделения строки запроса на отдельные параметры, разделенные символом &. Функция strtok возвращает указатель на первый параметр (p), а в качестве разделителя указывает пустую строку ``.
  5. Если p не равен NULL (то есть был найден параметр), то выполняется следующий блок кода.
  6. В этом блоке кода происходит копирование значения параметра в строку test, начиная с offset. При этом из значения параметра удаляется префикс p=, который состоит из символа p и пробела.
  7. После копирования значения параметра выполняется увеличение offset на длину copied (значение параметра без префикса) - 10 (длина префикса p=). Это позволяет сдвинуть указатель test на следующую позицию, чтобы начать копирование следующего параметра.
  8. После выполнения всех итераций цикла while, в строке test будут содержаться значения всех параметров запроса, разделенные пробелами.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы