2016-03-11 4 views
1

я написал эту функцию для домашнего задания я делаю в школе:Моего getToken не работает по первому зову

char* getToken(char buffer[], int pos) 
{ 
    int i; 
    char copy[350], *token, *del = ",\n"; 

    strcpy(copy, buffer); 
    token = strtok(copy, del); 

    for (i = 1; i < pos; i++) 
     token = strtok(NULL, del); 

    return token; 
} 

Я хочу его вернуть маркер в заданном положении без искажая исходный массив символов. Проблема в том, что он возвращает мусор при первом вызове, но он работает так, как ожидалось, во всех последующих вызовах. Это должно быть очень простое исправление, но я весь день программировал, и мне нужен свежий набор глаз, чтобы поддержать меня. (Hardcoded 350 задан в этом задании домашней работы, буфер не должен превышать 349 символов)

+1

'token' указывает на часть локальной автоматической переменной. Также 'token' нужен NULL check – BLUEPIXY

+0

Чтобы заставить эту функцию работать, массив' copy' должен быть 'static', или вам нужно передать массив' copy' в функцию. Так же как и массив 'copy' исчезает, как только функция возвращается, и поэтому возвращаемый указатель недействителен. – user3386109

+0

@ user3386109: Или 'malloc()' 'copy'. – EOF

ответ

1

Вы возвращаете указатель, указывающий нестатические локальные переменные, которые будут исчезать при возврате из функции и разыменования возвращенного указателя от вызывающего вызывается не определено поведение.

Я думаю, вы должны скопировать маркер перед возвратом. Добавить #include <stdlib.h> для использования malloc() и free().

char* getToken(const char buffer[], int pos) 
{ 
    int i; 
    char *copy, *token, *ret, *del = ",\n"; 

    copy = malloc(strlen(buffer) + 1); /* for string longer than 349 bytes is passed */ 
    if (copy == NULL) return NULL; 
    strcpy(copy, buffer); 
    token = strtok(copy, del); 

    for (i = 1; i < pos; i++) 
     token = strtok(NULL, del); 

    ret = malloc(strlen(token) + 1); 
    if (ret != NULL) strcpy(ret, token); /* copy string before freeing it */ 
    free(copy); /* if you use malloc(), use free() */ 
    return ret; 
} 
Смежные вопросы