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



我用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] != '')
    {
        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] != '')
            {
                appendChar(tokens[temp_token_count], string[itr]);
                itr++;
            }
        }
        itr++;
    }
    return tokens;
}

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

int main()
{
    char * string = "This would,,,,be";
    char * delim = ",.:;*& ";
    char ** tokens = tokenize(string, delim);
    int x = 0;
    while(x<3)
    {
        printf("%sn", tokens[x]);
        x++;
    }
    return 0;
}
我希望这个调用的输出是:

This
would
be

然而,这是输出的内容:

 L@?
would
be

考虑到如果我用"This"作为输入字符串调用tokenize函数,我收到的结果也正是我所期望的:

This

我不知道是怎么回事,任何帮助都将非常感激,谢谢你的时间!

编辑:这是isDelimiter函数
int isDelimiter(char test_char, char * delimiters)
{
    int itr = 0;
    while (delimiters[itr] != '')
    {
        if (test_char == delimiters[itr]) return 1;
        itr++;
    } 
    return 0;
}

这是不正确的:

tokens = realloc(tokens, num_of_tokens);

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

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

另外,当您找到一个令牌时,您将在另一个while循环中遍历字符串,直到找到分隔符或NULL。这很好,但是,然后在外部while循环的底部再次增加itr。如果在内循环结束时发现NULL,则此增量将把索引移到字符串范围之外,从而导致未指定的行为。

只有在没有找到分隔符的情况下,才应该在外部循环中递增:

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

相关内容

  • 没有找到相关文章

最新更新