Использование 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'