使用dirent.h在C中实现ls程序

use*_*476 0 c ls dirent.h

我正在尝试使用dirent库实现ls程序.看来我的DIR*mydir是<unspecified type>我用gdb调试的时候,它告诉我,好像我没有正确包含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);
}
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 6

隐藏在错误呈现的代码中的是两个丑陋的错误:

while((entry==readdir(mydir))!=NULL);
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

请改用:

while ((entry = readdir(mydir)) != NULL) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

entry是未初始化的,编译时会启用警告,因为它gcc -Wall会发现问题.条件;结束时的额外while更难以发现,使用更一致的编程风格来避免这种错误.