2012-12-10 25 views
6

the manual引用這裏:C:中的dirname()是否錯誤?

功能目錄名()和基本名稱()破裂的空終止 路徑名字符串到目錄和文件名的組件。在通常的 的情況下,dirname()返回字符串,但不包括最終的 '/',而basename()返回最後的'/'後面的組件。 尾部的'/'字符不計算爲路徑名的一部分。

,後來,你有這樣的小桌子:

path   dirname basename 
"/usr/lib" "/usr" "lib" 
"/usr/"  "/"  "usr"  // wat? 
"usr"   "."  "usr" 
"/"   "/"  "/" 
"."   "."  "." 
".."   "."  ".." 

爲什麼dirname("/usr/")返回"/",而不是"/usr"
手冊中的句子告訴我,我應該得到/usr
我在一個虛擬程序中測試了實際結果,它的行爲就像手冊所說的那樣。

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

int main(int argc, char const *argv[]) 
{ 
    const char *mydir="/usr/"; 
    char *dummy = strdup(mydir); 
    char *dummy2 = strdup(mydir); 

    char *dname = dirname(dummy); 
    char *bname = basename(dummy2); 


    printf("mydir: '%s', dname: '%s', bname: '%s'\n", mydir, dname, bname); 

    free(dummy); 
    free(dummy2); 

    return 0; 
} 


$ ./test 
mydir: '/usr/', dname: '/', bname: 'usr' 

現在,我希望是:

path   dirname basename 
"/usr/"  "/usr"  ""  // more consistent? 

所以..任何人都明白這是怎麼回事呢?

回答

14

尾隨的'/'字符不計算爲路徑名的一部分。

因此,「在/ usr /」相同「的/ usr」,這可能表示一個文件或usr目錄/名(命名的目錄條目)的目錄。函數dirname返回路徑的父目錄。 /usr的父目錄是/。似乎完全一致。

+0

+1你得到了關鍵點並引用了它。僅供參考,還有奧斯汀集團對相關問題#612的解釋:http://austingroupbugs.net/view.php?id=612 –

4

一個目錄也是一個文件。 usr當然是文件/usr的基本名稱。這精確地遵循手冊 - 在/usr中,根-是最後的/usr就是它的後面,因此是基名。

至於/usr/ v。/usr,我懷疑這是因爲總是吞下最後的/,這是在其他地方指定或屬於「通常情況下」限定。否則/usr////usr///////////將涉及非常不同的實體...