2017-09-14 46 views
-2

我正在使用下面的代碼列出目錄中的文件。我怎樣才能將文件名添加到逗號分隔的字符串?如何將文件名添加到以逗號分隔的字符串中

#include <dirent.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir("/home/test/filename_test"); 
    char *start = ""; 
    char *filename_list = strdup(start); 

    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 
     int size = sizeof(dir->d_name); 

     printf("%s\n", dir->d_name); 

     printf("size of name is %d\n",size); 
    } 

    closedir(d); 
    } 

    return(0); 
} 
+1

分配一個緩衝區,使用'sprintf()'......這是什麼問題? –

+0

你真的想把它創建爲一個字符串嗎?或者只是想用逗號分隔顯示在控制檯上? – BLUEPIXY

回答

0

一個簡單的上下的方式做,這是

  • 使用的strdup( 「」)的循環之前分配一個零字符,空值終止的char *

  • 增加它在每次迭代中的大小。你可以使用realloc()來做到這一點,這將保留現有的內容,並騰出空間來添加更多。您可以通過添加舊的長度,文件名的長度,逗號的長度以及最終的長度來計算新緩衝區的長度。

  • 將您的文件名等追加到使用strcat()的緩衝區。

您需要一些邏輯來避免在列表末尾放置一個逗號,其後面沒有文件名。

這種方法的問題在於,由於重複的重新分配,它在某些系統中可能效率低下。更好的方法是使用緩衝區,在迭代時按塊調整大小。但是如果你打算這麼做的話,那麼使用C中已經存在的許多字符串處理庫中的一個可能會更容易一些。

+0

嗨凱文我正在嘗試實施你的建議。在上面的代碼中,文件名的大小顯示爲256.在解引用指向結構的指針時,可以使用運算符的大小嗎?謝謝 –

+0

對不起,如果我失去了一些東西,但我不知道爲什麼你需要一個結構的大小。在你給出的代碼示例中,我看不出有什麼需要這樣做。應用於_any_指針的'sizeof()'會給你指針所佔用的內存量 - 這有時很有用,但是,我再也看不出爲什麼你需要這個了。我認爲更好的辦法是發佈一些代碼供人們查看。 –

+0

嗨凱文,我的錯誤,我在'dir-> d_name'上使用'sizeof()',但是當您指出返回指針佔用的內存量時。我之所以這樣做是因爲我需要將一個大小傳遞給'realloc()',但事後看來,我需要傳遞'dir-> d_name'中的字符數加上其他項的大小。 –

相關問題