将一个char数组拆分为char数组数组时,第一个数组始终显示为随机字符

时间:2017-11-05 04:00:24

标签: c arrays string

我正在做学校练习,它要求我们将字符串(字符数组)拆分成多个字符数组。像这样的字符串输入

"asdf qwerty zxcv"

应该产生一个像这样的字符数组

"asdf","qwerty","zxcv"

当我测试代码时,无论我输入什么字符串作为我的函数的参数,打印出来的第一个字符串总是一些随机字符,而其余字符串是预期的。

"02�9�","qwerty","zxcv"

此外,我的代码在在线编译器中运行良好,我保存了here。我还在OnlineGDB中进行了测试,其中代码也运行良好。

这是我的主要功能代码:

#include <stdio.h>
#include <stdlib.h>

int     is_separator(char c)
{
    if (c == '\n' || c == '\t' || c == ' ' || c == '\0')
    {
        return (1);
    }
    else
    {
        return (0);
    }
}

int     ct_len(int index, char *str)
{
    int     i;

    i = index;
    while (!(is_separator(str[index])))
    {
        index++;
    }
    return (index - i);
}

int     ct_wd(char *str)
{
    int     count;
    int     i;

    i = 0;
    count = 0;
    while (str[i])
    {
        if (is_separator(str[i]))
            count++;
        i++;
    }
    return (count + 1);
}

char    **ft_split_whitespaces(char *str)
{
    char    **tab;
    int     i;
    int     j;
    int     k;

    i = 0;
    j = 0;
    tab = malloc(ct_wd(str));
    while (str[j])
    {
        k = 1;
        while (is_separator(str[j]))
            j++;
        *(tab + i) = (char *)malloc(sizeof(char) * ((ct_len(j, str) + 1)));
        while (!(is_separator(str[j])))
        {
            tab[i][k - 1] = str[j++];
            k++;
        }
        tab[i++][k - 1] = '\0';
    }
    tab[i] = 0;
    return (&tab[0]);
}

int   main(void)
{
    char** res;

    for (res = ft_split_whitespaces("asdf qwerty zxcv"); *res != 0; res++)
    {
        printf("'%s',", *res);
    }
    return (0);
}

一个提示是第一个数组的输出正在改变,这表明我的内存分配可能存在一些问题。但是,我不确定。如果你能帮助我找出bug的位置,我会非常感谢你的帮助。非常感谢你阅读。

1 个答案:

答案 0 :(得分:0)

这个

tab = malloc(ct_wd(str));

到这个

tab = malloc(ct_wd(str) * sizeof(char *));

你还想考虑使用valgrind,它应该提供腐败所在的公平指示。基本上ct_wd(str)函数是主要的罪魁祸首,之后是malloc语句。你可能想仔细看看你分配的内存量和实际使用量。如上所述,valgrind会更好地帮助你。

valgrind --tool=memcheck --leak-check=full --track-origins=yes <executalbe>