строковые указатели в C индексации - PullRequest
1 голос
/ 27 февраля 2012

Если у меня есть:

char *tokenPtr = "testingpointerindex"

и я хочу получить доступ ко всему после 4-го символа, как бы я поступил?Я попытался:

char *tokenPtr = "testingpointerindex";

char *host = tokenPtr + 4;
printf("%s\n",host);

return host;

Это просто вывод, но я надеюсь, что он дает достаточно информации, я получаю ошибку шины.Спасибо

РЕДАКТИРОВАТЬ:

Полный код

char * getHost(char *buf){
char *tokenPtr;
tokenPtr = strtok(buf, "\r\n" ); 
printf("got token\n");
while ( tokenPtr != NULL ) { 
    if(strncmp(tokenPtr,"Host",4) == 0){
        break;
    }
    else{
        tokenPtr = strtok( NULL, "\r\n" );
    }
}
char *host = tokenPtr + 7;
printf("%s\n",host);
    return host;
}
int main(int argc, char *argv[])
{
char *msg = "GET /index.html HTTP/1.1\r\n Host: www.google.com\r\n\r\n";
getHost(msg);


}

Ответы [ 4 ]

4 голосов
/ 27 февраля 2012

Приведенный выше код работает нормально.

Однако следует упомянуть одну вещь: строковые литералы (например, "testingpointerindex") не модифицируются в C. Поэтому вы должны использовать const char *, а не char *.

2 голосов
/ 27 февраля 2012

Изменение:

char *tokenPtr = "testingpointerindex";

до

static char tokenPtr[] = "testingpointerindex";

В вашем примере tokenPtr - это строковый литерал, а строковый литерал не модифицируется.

Спецификатор static требуется во втором примере, если вы планируете вернуть указатель на элемент массива, поскольку автоматические переменные отбрасываются в конце функции.

1 голос
/ 27 февраля 2012

Примечание: я обновил этот ответ, чтобы он соответствовал новому коду, опубликованному обновлением ОП

В следующем коде есть пара проблем:

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;
}
0 голосов
/ 27 февраля 2012

Fix:

char * getHost(char *buf){
char *tokenPtr;
tokenPtr = strtok(buf, "\r\n" ); 
printf("got token\n");

while ( tokenPtr != NULL ) { 

    if(strncmp(tokenPtr,"Host",4) == 0) break;

    else {tokenPtr = strtok( NULL, "\r\n"); break;}
}

char *host;
host = &tokenPtr[7];
printf("%s\n", host);
}

int main(int argc, char *argv[])
{
char msg[100] = "GET /index.html HTTP/1.1\r\n Host: www.google.com\r\n\r\n";
getHost(msg);
}

Узнай что не так;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...