我正在做学校练习,它要求我们将字符串(字符数组)拆分成多个字符数组。像这样的字符串输入
"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的位置,我会非常感谢你的帮助。非常感谢你阅读。
答案 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>