(C) - 字符串数组中的第一个元素变为垃圾

时间:2015-07-19 17:22:06

标签: c string malloc realloc

我在C中编写了以下函数来尝试对字符串进行标记。 该函数接受一个字符串进行标记化(char * string),以及一个用于将标记彼此分开的分隔字符串(char * delimiters)。

char ** tokenize(char * string, char * delimiters)
{
    int num_of_tokens = 0;
    int itr = 0;

    char ** tokens = NULL;

    while (string[itr] != '\0')
    {
        if (!isDelimiter(string[itr], delimiters))
        {
            num_of_tokens++; /*if char is not a delimiter, we have found a new token*/

            int temp_token_count = num_of_tokens - 1;

            tokens = realloc(tokens, num_of_tokens);
            tokens[temp_token_count] = malloc(STRING_SIZE * sizeof(char));

            while(!isDelimiter(string[itr], delimiters) && string[itr] != '\0')
            {
                appendChar(tokens[temp_token_count], string[itr]);
                itr++;
            }
        }

        itr++;
    }
    return tokens;
}

从main函数中,对tokenize函数的调用如下所示:

int main()
{
    char * string = "This would,,,,be";
    char * delim = ",.:;*& ";

    char ** tokens = tokenize(string, delim);

    int x = 0;

    while(x<3)
    {
        printf("%s\n", tokens[x]);
        x++;
    }

    return 0;
}

我希望此调用的输出产生:

This
would
be

然而,这就是输出:

 L@?
would
be

如果我用&#34来调用tokenize函数,这似乎特别奇怪。这个,&#34;作为输入字符串,我收到了我期望的内容:

This

我无法弄清楚发生了什么,感谢您的时间,我们将非常感谢您的帮助!

编辑:这是isDelimiter函数

int isDelimiter(char test_char, char * delimiters)
{
    int itr = 0;

    while (delimiters[itr] != '\0')
    {
        if (test_char == delimiters[itr]) return 1;
        itr++;
    } 

    return 0;
}

1 个答案:

答案 0 :(得分:2)

这是不正确的:

tokens = realloc(tokens, num_of_tokens);

由于tokens被用作指针数组,因此需要为num_of_tokens指针分配空间:

tokens = realloc(tokens, num_of_tokens * sizeof(char *));

此外,当您找到令牌时,您将在另一个while循环中遍历该字符串,直到找到分隔符或NULL。没问题,但是你会在外部itr循环的底部再次增加while。如果在内部循环的末尾发现NULL,则此增量会将int移动到字符串范围之外,从而导致未指定的行为。

如果您没有找到分隔符,则只应在外循环中增加:

while (string[itr] != '\0')
{
    if (!isDelimiter(string[itr], delimiters))
    {
        ...
    }
    else
    {
        itr++
    }
}