2016-12-24 69 views
0

我有下面的代碼列出目錄中的所有文件。我試圖將每個ep-> d_name添加到數組中,但到目前爲止,我所嘗試過的所有功能都沒有奏效。我應該如何繼續?如何將ep-> d_name插入C中的數組中

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <time.h> 
#include <errno.h> 
#include <sys/stat.h> 
#include <sys/times.h> 
#include <sys/wait.h> 

int main (void){ 
    DIR *dp; 
    struct dirent *ep; 
    dp = opendir("./"); 
    int count = 0; 

    char *fileNames = calloc(256, sizeof(char)); 

    if(dp != NULL){ 
     while(ep = readdir(dp)){ 
      printf("%s\n", ep->d_name); 
      count = count+1; 
     } 
     for (int i=0; i<count; i++){ 
     fileNames[i] = ep->d_name; 
     } 
     closedir(dp); 
    }else{ 
     perror("Couldn't open the directory"); 
    } 
    return 0; 
} 

這段代碼必須保持不變:

int main (void){ 

    DIR *dp; 
    struct dirent *ep; 
    dp = opendir("./"); 

    if(dp != NULL){ 
     while(ep = readdir(dp)){ 
      printf("%s\n", ep->d_name); 
     } 
     closedir(dp); 
    }else{ 
     perror("Couldn't open the directory"); 
    } 
    return 0; 

} 
+0

你嘗試過什麼?提供示例。我也看不到在你的代碼中任何地方聲明的數組,給我們更多的信息。 – Bargros

+1

你的意思是你的'fileNames'變量是單個字符串嗎?你不想讓它成爲一串字符串嗎? –

+0

是的,每個字符串實際上都是一個char *,一個指向內存中該字符串數據的指針,所以如果要存儲多個字符串,則必須具有指向char *或char **的指針,如下所示。當你查看手冊頁中的'scandir'定義時會更加困惑 - 因爲它保存了它自動分配的char **的地址,其第二個元素實際上是一個指向char **或char **的_pointer_ *'。然後,我傳入char **的_address_,我希望'scandir'存儲它分配的char **數組的_address_。 –

回答

1

爲什麼不使用scandir爲您提供的陣列,而不是通過迭代的條目?

這似乎爲我工作:

$ cat t.c 
#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <time.h> 
#include <errno.h> 
#include <sys/stat.h> 
#include <sys/times.h> 
#include <sys/wait.h> 

int main (void){ 
    DIR *dp; 
    struct dirent **list; 

    int count = scandir("./", &list, NULL, alphasort); 
    if(count < 0){ 
     perror("Couldn't open the directory"); 
     exit(1); 
    } 
    printf("%u items in directory\n", count); 
    for(int i=0; i<count;i++){ 
      printf("%s\n", list[i]->d_name); 
    } 
    return 0; 
} 

給我:

docker run -it --rm -v `pwd`/t.c:/t.c gcc bash -c "gcc -o t t.c && ./t" 
24 items in directory 
. 
.. 
.dockerenv 
bin 
boot 
dev 
etc 
home 
lib 
lib64 
media 
mnt 
opt 
proc 
root 
run 
sbin 
srv 
sys 
t 
t.c 
tmp 
usr 
var 
+0

無需更改原始代碼。 – krm

+0

以及你的代碼不起作用,所以要使它工作,你必須改變它 –

相關問題