2012-02-08 2 views
1

У меня есть длинная строка с информацией, как это (регулярное выражение?):Удалить часть строки в C

"GET http://www.google.se/ HTTP/1.1\r\n 
Host: www.google.se\r\n 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20100101 Firefox/4.0\r\n 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n 
Accept-Language: en-us,en;q=0.5\r\n 
Accept-Encoding: gzip, deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n 
Keep-Alive: 115\r\n 
Proxy-Connection: keep-alive\r\n 
Cookie: PREF=ID=7d6a62c557413bc8:FF=0:TM=1327968040:LM=1327968040:S=U1A51rCRDDMTF295\r\n 
Cache-Control: max-age=0\r\n\r\n" 

И я хочу, чтобы избавиться от Keep-Alive части под Proxy-Connection .. Это то, что я делаю до сих пор:

  1. Получение строки (заголовка) к функции.
  2. Создание с двумя-структуру строк (заголовок и хоста)
  3. положить имя хоста из заголовка в принимающей части (очевидно)
  4. и поставить заголовок в части заголовка.

И теперь я хочу избавиться от части keep-alive, прежде чем поместить заголовок в заголовочную часть структуры.

Любые идеи?

И вот какой код я сделал до сих пор. Я новичок в C, так не может быть самым красивым из кода, который вы уже видели ..

struct ParsedHeader header_parser(char * input) { 
    struct ParsedHeader h; 
    int status; 
    regex_t regex; 
    char * result_begin = NULL; 

    regcomp(&regex, "host:", REG_EXTENDED|REG_ICASE|REG_NOSUB); 
    if((status = regexec(&regex, input, (size_t) 0, NULL, 0)) == 0) { 
    char end = '\r'; 
    char * header = malloc(strlen(input)); 

    char * begin = "host:"; 

    size_t result_size = 0; 
    memcpy(header, input, strlen(input)); 
    to_lower(input, header, strlen(input)); 
    result_begin = (strstr(header, begin) + 6); 

    char * result_end = strchr(result_begin, end); 
    result_end[0] = '\0'; 
    //char result[strlen(result_begin)] = result_begin; 
    free(header); 
    } 
    regfree(&regex); 

    h.header = input; 
    h.host = result_begin; 

    return h; 
} 
+0

Может быть, если вы разместил здесь наиболее важные части вашего кода, этот вопрос привлечет больше внимания. –

+0

Вы хотите избавиться от этой конкретной строки 'KeepAlive: 115' или любого возможного значения для KeepAlive? –

+0

Ошибка: измените ваш malloc на malloc (strlen (input) +1), так как вам нужно выделить место для завершающего нуля. –

ответ

3

Если я правильно понимаю ваш вопрос, вы хотите удалить только строку «Keep-Alive». Делают это так:

// assume buffer contains the long input string 
char *pBegin; 
char *pEnd; 
pBegin = strstr(buffer, "Keep-Alive:"); 
if (pBegin) 
{ 
    pEnd = strstr(pBegin, "\r\n"); 
    if (pEnd) 
     strcpy(pBegin, pEnd+2); 
} 

Однако, если то, что вы хотите сделать, это удалить «Keep-Alive» строка из заголовка Proxy-Connection, аналогичное решение работает:

char *pBegin; 
char *pEnd; 
pBegin = strstr(buffer, "Proxy-Connection:"); 
if (pBegin) 
{ 
    pBegin = strstr(pBegin, "keep-alive"); 
    if (pBegin) 
     strcpy(pBegin, pBegin+strlen("keep-alive")); 
} 
+0

Я думаю, вы поняли неправильно: «Я хочу избавиться от части keep-alive под Proxy-Connection». Похоже, он предпочел бы изменить заголовок 'Proxy-Connection'. –

+0

Хммм ... Непонятно, поэтому я тоже добавлю решение. –

+0

hmm. ну, теперь я получаю ошибку сегментации. – MrYdremark

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