我有一個編程問題,希望有人能幫助我。我試圖在工作中學習C編程,併爲自己設置了一個小項目,其中包括讀取包含所有子目錄的文件樹,以獲取有關每個文件的信息。檢查目錄路徑以「。」,「..」結尾
我得到的問題是我的程序不會忽略目錄路徑以/結尾。或/ ..和當它打印所有的目錄時,我想在可讀性的子目錄前面留出空間。
所以誤差在這部分發生:
int isDir(const char *parent, char *name) {
struct stat st_buf; // file info
char buf[BUF_SIZE];
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
return 0;
}
char *path = malloc(strlen(name) + strlen(parent) + 2);
//sprintf(char *buf, const char *format, [arg1],[arg2],...)
sprintf(path, "%s/%s", parent, name);
stat(path, &st_buf); //
return S_ISDIR(st_buf.st_mode); //directory
}
而這主要和列表功能:
int list(const char *name) {
DIR *dirp = opendir(name);
struct dirent *dentry;
char buf[BUF_SIZE];
while ((dentry = readdir(dirp)) != NULL) {
char *dir_name = dentry->d_name;
printf(" %s\n", dir_name);
//if it's dir, then go into dir
if (isDir(name, dir_name)) { //name : parent, dir_name : child
chdir(dir_name);
getcwd(buf, BUF_SIZE);
list(buf);
}
}
closedir(dirp);
}
int main()
{
list(".");
return 0;
}
的結果是這樣的:
hm1.c Data lab1.txt result1 lab3.txt . .. . .. result2 lab3.txt . .. result3 lab3.txt . .. a.c . .. a.out
結果I wan噸至打印
hm1.c Data lab1.txt result1 lab3.txt result2 lab3.txt result3 lab3.txt a.c a.out
您的'isDir()'函數每次在'name'中調用'.'或'..'以外的內存都會泄漏內存。你也應該至少錯誤地檢查'malloc()'和'opendir()' - 也可以''chdir()'和'getcwd()'。 –
在打印任何內容之前,您需要額外檢查'.'和'..',並且您可能需要將其他深度參數傳遞給'list',以便您可以基於此進行縮進。 –
「printf(」%s \ n「,dir_name)中使用了'dir_name';'defined,set等? 'file_mode'和'my_passwd'變量也不被使用。請參閱製作MCVE([MCVE])的指導原則。他們讓人們更容易幫助你。您的代碼顯示似乎從原來的縮減,但不是最小化和不可驗證。 –