我试图递归地遍历目录并列出所有以.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结尾的文件和作为文件夹的文件。但是,输出为空白,可能会进入无限循环。
答案 0 :(得分:0)
这是一个无限循环:
while (name != "." || name != NULL) {
name++;
}
name
是char*
。除非将插入的字符串文字"."
存储在NULL
地址(不是),否则您是说循环应该永远继续,因为name
总是不指向到"."
的存储中或未指向NULL
。虽然我相信比较"."
和name
等无关的指针是正式的未定义行为,但实际上大多数(都是平面内存模型?)编译器仅允许任意指针比较,并且由于您从未取消引用该指针,所以您从未真正尝试读取您正在遍历的未分配地址(如果这样做,最终会出现段错误),因此它将永远持续下去。
我不清楚该循环的目标是什么(也许从“隐藏的”文件名中删除前导.
?),所以除了删除它之外,我真的没有其他建议。