【发布时间】:2023-03-21 03:00:01
【问题描述】:
我最近 2 个月才开始学习编程,这是我第一次使用 StackOverflow,所以希望我没有搞砸格式。 这几天我一直坚持这个练习。
说明:
参数: #1。要拆分的字符串。 #2。分隔符。
返回值:拆分产生的新字符串数组。 如果分配失败,则为 NULL。
允许的外部函数: malloc、free
分配(使用 malloc(3))并返回一个数组 通过拆分 's' 获得的字符串 字符 'c' 作为分隔符。数组必须是 以 NULL 指针结束。
我当然知道有一种更简单的方法可以做到这一点,但我非常害怕在网上搜索,因为我觉得我通过尝试欺骗了自己学习。 我决定做的是创建一个计数器函数来检查分隔符之间有多少单词(也就是第一个数组的大小),然后我检查每个单词的大小并将其存储在我用来创建的整数数组中第一个数组将指向的每个数组的长度。然后我填充每个数组。
我使用的测试器说我在 5 个测试中的两个中有分段错误,即使我的函数的输出与测试的假定输出匹配。
我真的被困住了,并且开始因为落后于已经提交整个项目的朋友而感到非常难过。
希望有人能教我我做错了什么。感谢您的宝贵时间!
char **ft_split(char const *s, char c)
{
int i;
int size;
int *elem;
char **new;
size = counter(s, c);
elem = sizeofeachstring(s, c);
i = 0;
if (s == NULL)
return (NULL);
new = malloc(sizeof(char *) * size);
if (new == NULL)
return (NULL);
while (i < size)
{
if (i < size)
new[i] = (char *)malloc(sizeof(char) * (elem[i] + 1));
i++;
}
fillarrays(s, c, new);
return (new);
}
static int counter(char const *s, char c)
{
int count;
int i;
i = 0;
count = 0;
while (s[i])
{
while (s[i] == c)
i++;
if (s[i] != c && s[i])
count++;
while (s[i] != c && s[i])
i++;
}
return (count);
}
static int *sizeofeachstring(char const *s, char c)
{
int i;
int len;
int n;
int *elem;
int size;
i = 0;
len = 0;
n = 0;
size = counter(s, c);
elem = (int *)malloc(sizeof(int) * size);
while (s[i] != '\0')
{
if (s[i] != c)
len++;
if ((s[i] != c && s[i + 1] == c && len > 0))
{
elem[n] = len;
len = 0;
n++;
}
i++;
}
return (elem);
}
static char **fillarrays(char const *s, char c, char **new)
{
int i;
int j;
int k;
j = 0;
i = 0;
k = 0;
while (s[i] != '\0')
{
while (s[i] == c)
i++;
if (s[i] == '\0')
break ;
if (s[i] != c)
{
new[j][k++] = s[i++];
if (s[i] == c)
{
new[j][k] = '\0';
if (s[i] != '\0' || s[i + 1] != '\0')
{
j++;
k = 0;
}
}
}
}
return (new);
}
【问题讨论】:
-
欢迎来到 StackOverflow!请拨打tour 了解本网站的运作方式。 ——你的问题对于第一次发帖来说很好。您可能希望提供 minimal reproducible example 并输入数据。请edit您的问题。 -- 无论如何,你应该使用你的调试器,让应用程序崩溃。调试器应该向您显示发生这种情况的位置。或者,您可以在有趣的地方插入一些
printf()并检查您的假设。 TL;DR:学习调试小程序。 ;-) -
您应该能够通过分配单个字符串并将原始字符串复制到其中来更简单地执行此操作。然后要么使用strtok()(如果允许),要么自己实现类似的功能。最后,分配指针数组(此时您应该知道标记的数量)并用指向每个标记的指针(第一个子字符串和空字符之后的每个后续子字符串,直到字符串末尾)填充它。