2010-10-09 90 views
0

我需要建立一個文件路徑。我有以下類方法:在C++中使用cstrings建立路徑的正確方法

void Directory::scanDirectory(char *directory) { 
    DIR *dirp; 
    struct dirent *entry; 
    char path[1]; 

    if(dirp = opendir(directory)) { 
     while(entry = readdir(dirp)) { 
      if (entry->d_name[0] != '.') { 
       strcpy(path, directory); 
       strcat(path, "/"); 
       strcat(path, entry->d_name); 
       if (entry->d_type == 8) { 
        // Files 
       } else if (entry->d_type == 4) { 
        //scanDirectory(path); 
       } 
       printf("Name: %s, Type: %d\n", entry->d_name, entry->d_type); 
      } 
     } 
     closedir(dirp); 
    } 
} 

我需要通過連接目錄和entry->d_name建立路徑的文件。當我嘗試運行這段代碼時,它會出現段錯誤。從我可以告訴它在我建立路徑的地方進行分割。有沒有更好的方法來做到這一點?

回答

1

緩衝區path需要有足夠的空間來保存整個路徑。現在它只有一個角色的空間。嘗試讓它變大。 strcat本身不分配空間。您必須手動管理該內存。

至於更好的方法,你可能想使用string來看看。您不需要擔心內存,並且可以與+運算符連接。

3

您只爲路徑分配一個字節(char path[1])。您需要分配足夠的空間來保存您創建的整個路徑。給定C++標記,很明顯可能是使用std::string,並且在將所有片段放在一起形成一個完整路徑後,使用其成員函數c_str()以C風格字符串的形式訪問內容。

1

更改char path[1];到:

char path[512]; //or whatever value you like. 

在你的代碼,僅路徑1個性格和\0分配的空間。顯然你需要一個更大的目錄,據我所知,在unix中,目錄名最多可以有255個字符,所以我認爲512就足夠了。

1

小心使用strcpy。即使path僅爲char[1],它也不會執行邊界檢查,它將嘗試將所有directory複製到其中。這可能是你的seg故障。

對於如何構建字符串,您有很多選擇。這是一個漫長的SO張貼在C++字符串連接效率:

Efficient string concatenation in C++

如果您使用C++,有沒有你不能只用任何理由內置string庫與+操作?例如:

string path; 
//... 
path += directory; 
path += "/"; 
path += entry->d_name; 
//etc. 

使用string類可能會稍微低效率的,但它會幫助你避免緩衝區溢出問題,就像你得到的分割故障存儲器例外額外的好處(我不是說string將避免所有這些,但它會讓你的生活更輕鬆)。

有也一直在另一個之前的SO張貼關於如何建立一個目錄字符串在C++:

c++ how to create a directory from a path

相關問題