【发布时间】:2021-05-29 20:59:27
【问题描述】:
我有一个名为 ft_split(char const *s, char c) 的函数,它应该接受字符串和分隔符 char c 并将 s 分成一堆更小的字符串。
我正在尝试解决它和我的方法是第 3 天或第 4 天:
-
计算编号。字符串中的字符数,当时包括 1 个定界符(如果空格是定界符,那么如果一行中有 2 个或更多空格,则计算一个空格而不是更多。为什么?那个空格是用于添加 '\0' 的内存每个拆分字符串的结尾)
-
它找到分隔符之间的字符大小 (k) -> malloc 内存 -> 从字符串复制到 malloc -> 从 malloc 复制到 malloc -> 重新开始。
但是...函数显示分段错误。调试器显示,在分配“大”内存后,它不会进入 while 循环,而是在退出函数后直接进入 big[y][z] = small[z]。
感谢任何提示。
#include "libft.h"
#include <stdlib.h>
int ft_count(char const *s, char c)
{
int i;
int j;
i = 0;
j = 0;
while (s[i] != '\0')
{
i++;
if (s[i] == c)
{
i++;
while (s[i] == c)
{
i++;
j++;
}
}
}
return (i - j);
}
char **ft_split(char const *s, char c)
{
int i;
int k;
int y;
int z;
char *small;
char **big;
i = 0;
y = 0;
if (!(big = (char **)malloc((ft_count(s, c) + 1) * sizeof(char))))
return (0);
while (s[i] != '\0')
{
while (s[i] == c)
i++;
k = 0;
while (s[i] != c)
{
i++;
k++;
}
if (!(small = (char *)malloc(k * sizeof(char) + 1)))
return (0);
z = 0;
while (z < k)
{
small[z] = s[i - k + z];
z++;
}
small[k] = '\0';
z = 0;
while (z < k)
{
big[y][z] = small[z];
z++;
}
y++;
free(small);
}
big[y][i] = '\0';
return (big);
}
int main()
{
char a[] = "jestemzzbogiemzalfa";
ft_split(a, 'z');
}
【问题讨论】:
-
任何提示。使用调试器。至少它会立即告诉您触发 seg 故障的确切线路。这是应该收集的第一条信息。还可以使用调试器单步调试代码并在运行时对其进行检查,以查看哪里以及为什么会出现问题。
-
函数显示分段错误。段错误发生在哪一行代码上?调试器会为您提供该信息。
-
好吧,看来你不知道如何充分使用调试器。建议您学习一下,因为这将为您节省大量时间。无论如何,问题可能与您的
big分配有关。这不是分配二维数组的正确方法,因此访问可能会导致段错误。请参阅:Correctly allocating multi-dimensional arrays 和 How do I dynamically allocate a 2d array of chars? -
bt给出回溯。其中包括程序停止的当前代码行。 -
p用于“打印”,例如p y、p z查看索引是否(何时)在访问big[y][z]时崩溃。p big[y]也可能很有启发性。
标签: c multidimensional-array malloc delimiter