在 C 中递归期间丢失先前在二维字符数组中分配的值

问题描述 投票:0回答:0

最终目标是将字符串从别名链接列表转换为“别名”值,每次转换时我们都会重新检查列表,以防万一新值也有别名。

我正在尝试使用“禁止”字符串的 char 2d 数组来分隔程序应该返回的时间。规则是“如果这个字符串已经是这个值就停止”,例如防止无限循环 a=b b=c c=d d=a.

基本的想法是,我将我的转换器之前遇到的所有字符串收集到一个二维数组中,该数组在这样的结构中声明:

char   *ban[MAX_VALUE];

在这段代码中,

**ban
函数 first_replace 的丢失值会出现问题: (请假设以 ft_ 开头的每个函数的工作方式与它的 C 库等效,它们来自学校项目“重写这些东西以学习”风格。例如 ft_strdup 是 strdup)。

static bool alias_ban(char *name, char **ban)
{
    int idx;

    idx = 0;
    while (ban[idx] != NULL)
    {
        if (ft_strequ(name, ban[idx]))
            return (true);
        idx++;
    }
    return (false);
}

static void first_replace(t_alias *a, t_shell *shell, t_al *blk, char **ban)
{
    t_alias *a1;
    int     i;

    a1 = shell->alias;
    i = 0;
    while (a != NULL)
    {
        if (ft_strequ(blk->mid, a->alias_name))
        {
            while (ban[i])
                i++;
            ban[i] = ft_strdup(blk->mid);
            if (alias_ban(a->real_name, &ban[0]) == false)
            {
                ft_memset(blk->mid, '\0', sizeof (char) * MAX_BUFF);
                blk->mid = ft_strdup(a->real_name);
                if (alias_exists(blk->mid, shell->alias) == true)
                    first_replace(a1, shell, blk, &ban[0]);
                else
                    return ;
            }
            else
                return ;
        }
        a = a->next;
    }
}

void    alias_first_word(t_shell *shell, t_al *blk, char *node)
{
    int     i;
    int     len;
    char    *tmp;
    t_alias *a;

    i = 0;
    a = shell->alias;
    while (node[i] != '\0' && ft_isspace(node[i]))
        i++;
    blk->start = ft_strsub(node, 0, i);
    len = i;
    while (node[len] != '\0' && !ft_isspace(node[len]))
        len++;
    blk->mid = ft_strsub(node, i, len - i);
    if (len < (int)ft_strlen(node))
        blk->end = ft_strsub(node, len, ft_strlen(node) - len);
    if (alias_exists(blk->mid, shell->alias) == true)
        first_replace(a, shell, blk, &blk->ban[0]);
    tmp = alias_rebuild_node(blk);
    ft_memcpy(node, tmp, ft_strlen(tmp));
}

我尝试给函数 first_replace &blk->ban[0]、blk->ban、just blk 和 &blk,试图看看指针恶作剧是否有效。到目前为止没有运气。

任何建议/想法/残酷的批评?

arrays c pointers recursion memory-management
© www.soinside.com 2019 - 2024. All rights reserved.