2015-10-13 3 views
1

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

Думая о проблеме, я собирался идти через каждый полукокса в линии запроса с какой-то 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? Как я могу «подрезать» то, что попадает в мою переменную? Или я совершенно не понимаю, как работает эта функция?

+3

Как вы думаете, strtok() было бы полезно здесь? –

+0

Я не слышал об этом раньше, но это выглядит интересно. Я googling, чтобы найти несколько примеров использования, чем просто справочную страницу, но есть ли у вас какие-нибудь хорошие, которые вы знаете о своей голове? –

+1

@ komali_2 [См. Здесь] (http://en.cppreference.com/w/c/string/byte/strtok) – ameyCU

ответ

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); 

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

+0

Что подразумевается под 'const char * p = request_line, * p1;'? Я никогда не видел этот синтаксис раньше (запятая в объявлении) –

+0

@ komali_2 Это всего две объявленные переменные 'char *'. Первый ('p') инициализируется, а второй (' p1') - нет. Это своего рода путаный синтаксис, поэтому я предпочитаю сделать их двумя отдельными строками. –

1

Это показывает, как использовать функцию 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' 

 Смежные вопросы

  • Нет связанных вопросов^_^