Примечание: я обновил этот ответ, чтобы он соответствовал новому коду, опубликованному обновлением ОП
В следующем коде есть пара проблем:
while ( tokenPtr != NULL ) {
if(strncmp(tokenPtr,"Host",4) == 0){
break;
}
else{
tokenPtr = strtok( NULL, "\r\n" );
}
}
char *host = tokenPtr + 7;
Первая проблема заключается в том, что есть вероятность, что вы могли бы выйти из цикла while, потому что tokenPtr
- это NULL
... вас не насторожит такая возможность.Во-вторых, вы предполагаете, что tokenPtr
указывает на строку по крайней мере длины 8
после того, как она была возвращена из strtok
, но это также не обязательно верно (Это должно быть верным в вашем примере кода, но в рабочем коде это может не быть правдой).
Наконец, strtok
изменяет строку, которую он обрабатывает, и вы передаете ей указатель на строковый литерал, который хранится в сегменте памяти только для чтения и не должен изменяться.Вы должны вызвать strdup
, чтобы создать свою строку, зная, что в какой-то момент вам нужно будет вызвать free
для возвращаемого указателя.Так, например:
int main()
{
char *msg = strdup("GET /index.html HTTP/1.1\r\n Host: www.google.com\r\n\r\n");
getHost(msg);
free(msg);
return 0;
}