【发布时间】:2018-08-08 06:45:23
【问题描述】:
上周我为我的班级分配了一个作业,我必须用空格、制表符和\n 作为分隔符来分割一个字符串,并将每个“单词”存储在一个数组中。我想我已经很接近了,但是我的输出很奇怪,所以如果有人能说出我忘记了什么,那就太好了。唯一的问题是我只能使用malloc。
char **ft_split_whitespaces(char *str)
{
int i;
int j;
int k;
char **tab;
i = 0;
j = 0;
k = 0;
tab = (char**)malloc(sizeof(*tab) * (ft_nb_words(str) + 1));
while (str[i])
{
while (str[i] == ' ' || str[i] == '\t' || str[i] == '\n')
i++;
if (str[i])
{
if ((tab[j] = (char*)malloc(sizeof(char) * (ft_len_word(str + i) + 1))) == NULL)
return (NULL);
while (k < ft_len_word(str + i))
tab[j][k++] = str[i++];
tab[j++][k] = '\0';
k = 0;
}
}
tab[j] = NULL;
return (tab);
}
返回单词长度和单词数的函数工作正常,所以我认为问题来自主函数。
【问题讨论】:
-
请注意,如果循环中的
malloc()失败,则会泄漏内存。但是,这不是您当前问题的一部分。 -
这个循环很可疑:
while (k < ft_len_word(str + i)) tab[j][k++] = str[i++];— 你在增加i,但我认为你不想这样做。可能在循环外捕获长度;那么你可能会没事。但就目前而言,我认为你有问题。 -
好的,就是这样,非常感谢
-
我该如何解决内存泄漏问题?
-
在执行错误返回之前,您需要一个循环来释放已分配的字符串以及另一个调用来释放指针向量。严格来说,您也应该错误检查第一次分配。