为什么我的程序不显示任何输出?

时间:2019-03-28 00:22:48

标签: c

我试图递归地遍历目录并列出所有以.txt结尾的文件或文件夹名称。

void listFilesRecursively(char *basePath) {

    char path[1000];
    struct dirent *ptr;
    DIR *dir = opendir(basePath);

    // Unable to open directory
    if (!dir)
        return;

    while ((ptr = readdir(dir)) != NULL) 
    {
        if (strcmp(ptr->d_name,".") != 0 && strcmp(ptr->d_name, "..") != 0)
        {

            char *name = NULL;
            char *type = NULL;

            while (name != "." || name != NULL) {
                name++;
            }

            for (name = ptr->d_name; *name != '\0' ; name++) {

                if (name == '.') {
                    while (*name != '\0') {
                        *type = *name;
                        name++;
                    }
                        break;                      

                } else if (*name == '\0') {
                    printf("%s\n", ptr->d_name);
                }

            }                   

            if (strcmp(type,"txt") == 0)            
                printf("%s\n", ptr->d_name);

            // create new path from our base path
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, ptr->d_name);

            listFilesRecursively(path);

        }
    }
        closedir(dir);
}

我的预期结果是以.txt结尾的文件和作为文件夹的文件。但是,输出为空白,可能会进入无限循环。

1 个答案:

答案 0 :(得分:0)

这是一个无限循环:

        while (name != "." || name != NULL) {
            name++;
        }

namechar*。除非将插入的字符串文字"."存储在NULL地址(不是),否则您是说循环应该永远继续,因为name总是不指向到"."的存储中或未指向NULL。虽然我相信比较"."name等无关的指针是正式的未定义行为,但实际上大多数(都是平面内存模型?)编译器仅允许任意指针比较,并且由于您从未取消引用该指针,所以您从未真正尝试读取您正在遍历的未分配地址(如果这样做,最终会出现段错误),因此它将永远持续下去。

我不清楚该循环的目标是什么(也许从“隐藏的”文件名中删除前导.?),所以除了删除它之外,我真的没有其他建议。