【问题标题】:Keep getting segfault when trying to split a sentence into an array of arrays尝试将句子拆分为数组数组时不断出现段错误
【发布时间】: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()(如果允许),要么自己实现类似的功能。最后,分配指针数组(此时您应该知道标记的数量)并用指向每个标记的指针(第一个子字符串和空字符之后的每个后续子字符串,直到字符串末尾)填充它。

标签: arrays c


【解决方案1】:

在数组中填充单词后尝试用NULL填充**new

char    **ft_split(char const *s, char c)
{
...
   new = malloc(sizeof(char *) * (size + 1));
...
}
static char **fillarrays(char const *s, char c, char **new)
{
...
   new[j] = NULL;
   return (new)
}

从您的职能名称来看,我认为您正在 42Network 学校之一学习 您需要保护作为标准错误的 malloc 的其他东西

【讨论】:

  • 4 天 x 6 小时,我一直在做这件事,我所要做的就是添加 new[j + 1] = NULL... 有时感觉超级不知所措,我们开始寻找除了简单的事情之外的所有事情......非常感谢您抽出宝贵的时间!
  • 以防万一您遇到段错误,只需尝试使用 NULL 或 int / float 变量初始化指针,然后再使用它以获得最佳实践
猜你喜欢
  • 2020-08-15
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多