我正在尝试使用dirent库实现ls程序。当我用gdb调试时,我的DIR * mydir似乎是<unspecified type>
,它告诉我,好像我没有正确包含dirent.h标头,但我相信我正确地包含了所有必需的头文件。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
//Specifies whether or not to print hidden files
#define PRINT_HIDDEN 0
void readDirectory(char *dirString[]);
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("Usage: ./ls <directory>\n");
}
readDirectory(argv);
return 0;
}
void readDirectory(char *dirString[])
{
DIR *mydir;
struct dirent *entry;
//Opening the directory and checking if valid
mydir = opendir(dirString[1]);
if(mydir==NULL){
fprintf(stderr,"ls: cannot access %s: No such file or directory\n",
dirString);
exit(EXIT_FAILURE);
}
//Printing directories/files in specified directory
while((entry==readdir(mydir))!=NULL);
{
if(PRINT_HIDDEN)
{
printf("%s ",entry->d_name);
}
else
{
if(entry->d_name[0]!='.')
{
printf("%s ",entry->d_name);
}
}
}
printf("\n");
//Closing the directory
closedir(mydir);
}
答案 0 :(得分:6)
隐藏在错误呈现的代码中的是两个丑陋的错误:
while((entry==readdir(mydir))!=NULL);
{
...
}
请改用:
while ((entry = readdir(mydir)) != NULL) {
...
}
entry
未初始化,编译并启用警告,因为gcc -Wall
会发现问题。 ;
条件末尾的额外while
更难以发现,使用更一致的编程风格来避免此类错误。