2014-03-06 3 views
1

Я пытаюсь разобрать заголовок HTTP-запроса. Мне нужно пикап первую строку:C: значение strtok возвращает null

GET/HTTP/1.1

Однако выход на рисунке код:

Method: (null) 
Filename: (null) 
Version: (null) 
Client hostname: (null) 

Почему?

Код:

char *token; 
    const char delimiter[2] = " "; 
    token = strtok(NULL, delimiter); 
+1

Вы передаете 'NULL' в первом вызове' strtok() '. Где ваш буфер с запросом? Вы должны передать его в 'strtok()' при первом вызове. –

+1

Вы должны сначала вызвать 'strtok()' с аргументом non-NULL, но вы должны передать строку (буфер), которую вы обрабатываете. После первого вызова вам нужно вызвать его с аргументом NULL, чтобы он продолжался там, где он был остановлен. –

+0

Великие умы думают одинаково. –

ответ

2

Разделитель должен быть «\ г \ п», в противном случае некоторые части будут сцеплены

// Parse the request                     
    char *token; 
    const char delimiter[6] = " \r\n"; 

    token = strtok(buffer, delimiter); 
    method = token; 
    printf("Method: %s\n", method); 

    token = strtok(NULL, delimiter); 
    filename = token; 
    printf("Filename: %s\n", filename); 

    token = strtok(NULL, delimiter); 
    version = token; 
    printf("Version: %s\n", version); 

    while (token != NULL) { 
     if (strstr(token, "Host:") != NULL) { 
     token = strtok(NULL, delimiter); 
     client_hostname = token; 
     break; 
     } 
     token = strtok(NULL, delimiter); 
    } 

    printf("Client hostname: %s\n", client_hostname); 
4

Первый раз, когда вы звоните strtok вам необходимо предоставить строку, которую вы хотите разделить в качестве первого аргумента. Последующие вызовы strtok должны использовать NULL в качестве первого аргумента для получения последующих строк с разделителями.

Удачи.

+0

О, спасибо - моя ошибка. ОК, теперь только имя хоста - нуль - почему? – chuckfinley

+0

ОК, я разделил запрос на разделитель "". Однако первая и вторая строки разделяются с помощью \ r \ n - и они не становятся разделенными. Могу ли я указать несколько вариантов разделения? – chuckfinley

+0

@chuckfinley Да, и это то, что вам нужно сделать. Дайте ему '' \ n "'. Обратите внимание, что когда вы вводите 'if (strcmp (токен,« Host: ») == 0)', вам нужно выполнить другой 'strtok()', чтобы получить фактическое имя хоста. –