C:意外的行为,错误的列表返回了?

时间:2014-12-01 14:51:47

标签: c

我正在进行一项任务,我被要求编写一些unix的ls代码。 我遇到问题的部分是-R选项。

某些背景: 我正在使用一个包含2个列表的结构,一个用于文件,另一个用于在运行ls时作为参数传递的目录。如果除了options之外没有其他参数,我创建一个包含“。”的目录节点。

如果没有-R选项,如果列表中有文件,我会将其副本传递给显示功能,然后清除文件列表。如果没有,但有目录,我打开一个,读取并将其内容复制到文件列表,释放当前目录节点,然后像常规文件列表一样继续。这很好用。

但是,使用-R选项,我做的完全相同,但在读取目录时,如果其中有子目录,我将后者添加到目录列表中。从理论上讲,这应该可以正常工作并防止使用递归,但由于某种原因,返回的列表只显示包含目录,没有文件。这个问题似乎只有在除了选项之外没有任何争论时才会出现...... 这是代码:

t_list          *ft_output_bigr(t_input *input)
{
    t_list          *dir_content;
    DIR             *dir_stream;
    struct dirent   *buf;

    if (!input->files->content && !input->dir->content)
            return (NULL);
    if (input->files->content)
            return (ft_lstcpy_and_del(input->files));
    dir_stream = opendir(input->dir->content);
    ft_lstfreeone(&input->dir, input->dir);
    while ((buf = readdir(dir_stream)))
    {
            dir_content = ft_lstnew(buf->d_name, sizeof(buf->d_name));
            ft_lstadd(&input->files, dir_content);
            if ((ft_is_dir(buf->d_name)) && ft_strcmp(buf->d_name, ".") != 0
                    && ft_strcmp(buf->d_name, "..") != 0)
            {
                    ft_lstadd(&input->dir, dir_content);
            }
    }
    closedir(dir_stream);
    return (ft_lstcpy_and_del(input->files));
}

这是调用它的函数,它处理选项和显示。

int             ft_process_input(t_input **input)
{
    t_list          *output;

    while ((output = (ft_strchr((*input)->opt, 'R')) ? ft_output_bigr(*input)
            : ft_output(*input)))
    {
            output = (ft_strchr((*input)->opt, 'a')) ? output
                    : ft_rem_hidden(&output);
            output = (ft_strchr((*input)->opt, 't')) ? ft_t(&output)
                    : ft_parse(&output);
            output = (ft_strchr((*input)->opt, 'r')) ? ft_lstrev(&output) : output;
            output = (ft_strchr((*input)->opt, 'l')) ? ft_l(output) : output;
            while (output)
            {
                    ft_putendl(output->content);
                    ft_lstfreeone(&output, output);
            }
    }
    return (1);
}

我在返回之前检查了文件列表,似乎没问题。但由于某种原因,一旦它传递给process_input,bam,只剩下目录。 所以是的,我迷失在这里。出于想法尝试......帮助? :d

编辑:添加有关行为的信息。 所以我认为我的列表在返回之前是正常的,因为我检查了第一个节点,它没问题。傻我。该列表实际上在返回之前被搞砸了,这至少更有意义。 所以似乎正在发生的是文件和目录列表以某种方式混合,当我返回input->文件时,返回input-> dir。 我暗示两个列表中的某些东西指向同一个头(dir列表的头部),因为我向两者添加了dir_content。我会尝试添加dir_content或其他东西的副本,然后回复新闻。

1 个答案:

答案 0 :(得分:2)

好的,修好了。 故事的道德:您不能简单地将节点添加到2个列表中,并且期望结果有2个不同的列表。