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

C:意外行为,返回错误列表?,c,C,我正在处理一项任务,其中要求我编写一些unix的ls。 我遇到的问题是-R选项 一些背景: 我正在使用一个包含两个列表的结构,一个用于文件,另一个用于在运行ls时作为参数传递的目录。如果除了选项之外没有参数,我将创建一个包含“.”的dir节点 如果没有-R选项,如果列表中有文件,我会将其副本传递给display函数,然后清除文件列表。如果只有目录,则打开一个目录,读取其内容并将其复制到文件列表中,释放当前目录节点,然后像常规文件列表一样继续。这个很好用 尽管使用-R选项,我做了完全相同的事情,但

我正在处理一项任务,其中要求我编写一些unix的ls。 我遇到的问题是-R选项

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

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

尽管使用-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->files时,input->dir反而返回。 当我向两个列表添加dir_内容时,我暗示了两个列表中指向同一头(dir列表的头)的东西。我将尝试添加目录内容或其他内容的副本,然后返回新闻。

好的,修复它。
这个故事的寓意是:你不能简单地将一个节点添加到两个列表中,然后期望得到两个不同的列表。

你做过任何调试来缩小问题的范围吗?@MarshallTigerus嗯,我对编程不熟悉,但我尝试了我所知道的。检查变量值,比如readdir循环中的input->files->content,或者在返回之前,这部分看起来很好。奇怪的是,常规清单(no-R)使用了完全相同的代码,而且工作正常。我添加的只是while readdir循环中的“如果是dir,则将其添加到dir列表”。一些精确性:当我使用*-R执行ls时,它会按预期“工作”,这意味着它尝试访问./dir中的文件,但无法访问,因为dir name!=路径名。没关系,我知道我总有一天会处理好的。尽管如此,文件列表还是按原样填写和返回了。只有在使用-R执行ls时,才会返回目录,所以我想这与我的“.”dir节点有关,但同样,这部分在不使用-R选项时工作正常。对。在列表中添加内容不会创建新列表,而是修改现有列表。