我的getToken函数在第一次调用时不起作用

时间:2016-03-11 02:13:43

标签: c token

我已经为我在学校做的家庭作业写了这个功能:

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; 
}

我希望它在给定位置返回一个令牌,而不会破坏原始字符数组。问题是它在第一次调用时返回垃圾,但它在所有后续调用中按预期工作。这应该是一个非常简单的修复,但我整天都在编码,我需要一双新的眼睛支持我。 (硬编码的350是本作业中给出的,缓冲区不应超过349个字符)

1 个答案:

答案 0 :(得分: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;
}