最终目标是将字符串从别名链接列表转换为“别名”值,每次转换时我们都会重新检查列表,以防万一新值也有别名。
我正在尝试使用“禁止”字符串的 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,试图看看指针恶作剧是否有效。到目前为止没有运气。
任何建议/想法/残酷的批评?