Не могу правильно использовать strstr () в C - PullRequest
0 голосов
/ 26 февраля 2019

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

int find_cookie(const char * request){
    char * start_pointer = NULL;
    long ret = 0;

    if ((start_pointer = strstr(request, "Cookie:") != NULL)){
        //Do stuff with the pointer
        //such as using strtol to get the value as a number
        ret = strtol(start_pointer + strlen("Cookie:"), NULL, 10);
    }else return 0;

    return (int) ret;
}

Теперь можно подумать, что проблема заключается в strtol ().Однако после использования GDB я заметил, что когда нет поля cookie, он возвращает NULL (как и ожидалось), но, с другой стороны, если он есть, и я пытаюсь напечатать значение start_pointer, он напечатает: «Не удается получить доступ к памятиадрес 0x1 ".В чем здесь дело?Кстати, когда я отлаживаю программу, я вижу, что переменная запроса содержит весь запрос, и в конце я добавил '\ 0'.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019
if ((start_pointer = strstr(request, "Cookie:") != NULL)){

должно быть

if (((start_pointer = strstr(request, "Cookie:")) != NULL){

Обратите внимание на изменение местоположения скобки.

Оператор присвоения = имеет более низкий приоритет, чем оператор !=.То, что у вас есть, эквивалентно:

if ((start_pointer = (strstr(request, "Cookie:") != NULL)){

, который в основном присваивает результат сравнения start_pointer.

Однако вам не нужно сравнивать с NULL вообще(потому что любое ненулевое значение «истина» в C).Вы могли бы просто написать:

if ((start_pointer = strstr(request, "Cookie:"))){
    ...
}

или

char * start_pointer = strstr(request, "Cookie:");
if (start_pointer) {
    ...
}

Таким образом, это намного легче читать и помогает избежать таких ошибок.

0 голосов
/ 26 февраля 2019

У вас неправильный порядок операций.Попробуйте вместо этого:

if ((start_pointer = strstr(request, "Cookie:")) != NULL){

В противном случае вы устанавливаете start_pointer для результата сравнения, который равен 1 (true).

...