Использование strchr() для создания нескольких строк из одной главной строки

Я работаю над программой на C для класса, который требует, чтобы я взял строку запроса и разбил ее на следующие части. Это для целей обучения, поэтому я могу ожидать довольно стандартную строку запроса.

Думая о проблеме, я собирался пройтись по каждому символу в строке запроса с каким-то for() цикл, который создает новую строку каждый раз, когда он встречает SP, но мне было интересно, если есть способ использовать strchr() указать на каждый "кусок" строки запроса?

Так как строка запроса выглядит как method SP request-target SP HTTP-version CRLF где SP это один пробел, есть ли способ, как я мог бы создать функцию, которая использует strchr(request-line, ' ') создать string (или же char* или же char[ ]) что потом заканчивается на следующем SP?

редактировать:

Чтобы я мог сделать что-то вроде

char method = strchr(request-line, ' ');

Но тогда "метод" не будет каждым символом после SP? Как я могу "обрезать" то, что помещено в мою переменную? Или я совершенно не понимаю, как работает эта функция?

2 ответа

Решение

Технически вы можете использовать strtok, но это изменит строку запроса на месте, что может быть приемлемо, но не в каждой ситуации. Вот обобщенное решение:

char *method, *target, *version;
const char *p = request_line, *p1;

while (*p != ' ')
{
   p++;
}
method = strndup(request_line, p - request_line);
p1 = ++p;
while (*p != ' ')
{
   p++;
}
target = strndup(p1, p - p1);
p1 = ++p;
while (*p != '\r')
{
   p++;
}
version = strndup(p1, p - p1);

Поскольку вы ожидаете только хорошо отформатированный ввод, я пропустил все проверки ошибок.

Это показывает, как использовать strchr() Функция, которую вы упомянули. Я предполагаю, что, как вы говорите, между каждым элементом строки есть один пробел. Я замутил несколько вещей, поскольку я не даю полного ответа на домашнюю работу. Одним из них является ли пространство перед CRLF Вы показываете, что существует - я предполагаю, что это так, как вы показываете, но если нет, вам придется иметь дело с этим, возможно, с помощью strcspn() вместо strchr(), Другой глянец должен принять максимальную длину, в реальной жизни вы бы malloc() (и позже free()) память, необходимая для substring,

#include <stdio.h>   
#include <string.h>   

#define MAXLEN 100

int main(void)
{
    char input[] = "method request-target HTTP-version \r\n";
    char substring[MAXLEN+1];
    char *sptr, *lptr;
    int len;

    lptr = input;                                   // start of search
    while ((sptr = strchr(lptr, ' ')) != NULL) {
        len = sptr - lptr;                          // length of phrase
        if (len > MAXLEN)
            return 0;                               // simple precaution
        memcpy(substring, lptr, len);               // copy the substring
        substring[len] = 0;                         // nul-terminate it
        printf("Substring is '%s'\n", substring);   // tell us what it is
        lptr = sptr + 1;                            // advance to next search
    }
    return 0;
}

Выход программы:

Substring is 'method'
Substring is 'request-target'
Substring is 'HTTP-version'
Другие вопросы по тегам