2013-10-14 48 views
2

這可能只是一個語法上的事情,我做錯了,但我不能爲我的生活弄清楚,所以我很抱歉,如果這是太「HEY爲我調試我的代碼!」C目錄遍歷 - 它不應該打印目錄名稱

相關代碼:

struct dirent *readDir; 
DIR *dir; 
dir = opendir(name); 

if(dir == NULL) { 
    printf("No directory found with the name %s\n", name); 
} else { 
    printf("directory named %s opened.\n", name); 

    while((readDir = readdir(dir)) != NULL) { 
     if(readDir->d_name != ".." || readDir->d_name != ".") { 
      printf("%s\n", readDir->d_name); 
     } 
    } 
    closedir(dir); 
} 

的如果while循環條件似乎並不工作,這裏的輸出它產生:

directory named test opened. 
file2 
. 
test2 
file1 
.. 

如果我沒有弄錯,如果聲明應該過濾掉。和..目錄,但它不。這樣做的目標是進行遞歸目錄遍歷,但是除非我能夠避免它重複進入。和..我不能真正移動的目錄。

基本上,我不知道如何做字符串比較我猜?

回答

6

C不支持「!=」或「==」字符串比較。使用strcmp();

if(readDir->d_name != ".." || readDir->d_name != ".") { 

應該

if(strcmp(readDir->d_name, "..") && strcmp(readDir->d_name, ".")) { 
    // d_name is not "." or ".." 
} 
+1

謝謝。如果不是很明顯,我是C新手。感謝幫助。 – mrowland

3

有兩個問題有以下幾點:

if(readDir->d_name != ".." || readDir->d_name != ".") { 

首先,你不能比較字符串這樣用C ...你基本上檢查是否字符串文字的地址與readDir->d_name中的地址相匹配。您需要使用像strcmp()這樣的功能。

二,當你或者那樣的條件時,只有一個需要是真的才能使整個表達式成立......並且因爲d_name不能等於「..」和「。」。同時,即使字符串比較確實按照您(可能)的預期工作,整體表達式始終爲TRUE。

所以,你需要這樣的東西:

if (strcmp("..", readDir->d_name) && strcmp(".", readDir->d_name)) { 

(因爲strcmp()收益非零當琴絃比賽,你需要匹配兩個字符串)。

+0

是的,我剛剛發現了||問題。謝謝你指出,它比我問的要多。 – mrowland