2013-10-19 63 views
2

我有下面的C代碼:While循環停止,沒有明顯的理由

#include <dirent.h> 
#include <stdio.h> 
#include <string.h> 
#include <signal.h> 
#include <unistd.h> 


int main(int argc, const char *argv[]){ 
    const char *directory_path; 
    directory_path = argv[1]; 
    char *dirname; 
    dirname = strdup(directory_path); 
    recursive_ls(dirname); 

} 


int recursive_ls(char *dirname){ 
    printf("%s\n",dirname); 
    DIR *d; 
    struct dirent *dir; 

    if ((d=opendir(dirname))==-1) { 
     perror("Oops"); 
     return(0); 
    } 
    if(d){ 
     while((dir = readdir(d)) !=NULL){ 
      char *dname = dir->d_name; 
      puts(dname); 
/*   if(strcmp(dir->d_type,DT_REG)){ 
       puts("I am a regular file"); 
      } else if(strcmp(dir->d_type,DT_DIR)){ 
       puts("I am a directory."); 
          recursive_ls(strcat(strcat(dirname,"/"),dir->d_name)); 
       } else { 
        puts("I am not a file"); 
      } 
*/  
     } 

     closedir(d); 
    } 
return(0); 
} 

如果我註釋掉while循環中的if(){} else if(){} else(){},我得到下面的輸出:

Debug 
.project 
pipe_test.c 
. 
.. 

這就是一切在目錄中。如果在另一方面,我取消它,然後我得到如下:

/home/wilbert/workspace/pipe_test 
.cproject 

我想我至少應該得到「我不是一個文件」部分,如果一切,如果遞歸步驟是擰的事情了;然而,由於某種原因,我不那麼困惑。這個東西編譯和顯示沒有語法錯誤,所以我真的很困惑。這是爲什麼發生?

+2

記住'strcmp'回報'0'當字符串相等 –

+1

@AlterMann你爲什麼不張貼的答案? – janos

+0

@janos,done :) –

回答

4

作爲喬納森建議d_typeunsigned char,因此改變爲:

if(dir->d_type == DT_REG){ 
    puts("I am a regular file"); 
} else if(dir->d_type == DT_DIR){ 
    puts("I am a directory."); 
    recursive_ls(strcat(strcat(dirname,"/"),dir->d_name)); 
} else { 
    puts("I am not a file"); 
} 
+0

@Henrik和+1到你的課程 –

+1

禮貌的傢伙的答案:) – Henrik

2

struct dirent的的d_type構件不是字符串(char *),但一個unsigned char。這實際上只是一個8位整數,這是一個原始類型。比較原始類型時,我們使用==運算符。 strcmp嚴格用於比較字符串。

if (dir->d_type == DT_REG) { 
    puts("I am a regular file"); 
} else if (dir->d_type == DT_DIR) { 
    puts("I am a directory."); 
    recursive_ls(strcat(strcat(dirname,"/"),dir->d_name)); 
} else { 
    puts("I am not a file"); 
} 

更多信息,請參見manual

而且,即使你原來的代碼編譯沒有錯誤,但如果加入了註釋的機身給人很多的警告。一個好的提示是總是將編譯器警告視爲錯誤。