2012-12-10 14 views
6

Powołując the manual tutaj:dirname() w C: czy instrukcja jest nieprawidłowa?

The dirname Funkcje() i basename() złamać pathname ciąg NUL do katalogu i nazwa komponentów. W zwykłej obudowie , dirname() zwraca ciąg znaków do, ale nie włączając, końcowego '/', a basename() zwraca komponent następujący po ostatnim "/". Końcowe znaki "/" nie są liczone jako część ścieżki.

A później, masz ten mały stolik:

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

Dlaczego dirname("/usr/") powracającego "/" i nie "/usr"?
Zdanie w instrukcji mówi mi, że powinienem otrzymać /usr w wyniku.
Przetestowałem rzeczywisty wynik w dummy programu i zachowuje się tak, jak mówi instrukcja.

#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' 

teraz, co by się spodziewać byłoby:

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

Więc .. ktoś rozumie, co się tu dzieje?

Odpowiedz

14

Trailing znaków „/” nie są liczone jako część ścieżki.

Stąd „/ usr /” jest taka sama jak „/ usr”, co może oznaczać plik lub katalog z nazwą (wpis w katalogu o nazwie) usr w katalogu /. Funkcja dirname zwraca katalog macierzysty ścieżki. Katalog nadrzędny /usr to /. Wydaje się być całkowicie spójny.

+0

+1 Otrzymałeś kluczowy punkt i zacytowałeś go. FYI jest także interpretacja Austin Group dla pokrewnego problemu # 612: http://austingroupbugs.net/view.php?id=612 –

4

Katalog jest również plikiem. usr jest oczywiście podstawową nazwą pliku /usr. Dokładnie wynika to z instrukcji - w katalogu /usr korzeń-/ jest końcowym i usr jest tym, co następuje po nim, stąd jest to nazwa podstawowa.

chodzi o /usr/ v. /usr, podejrzewam, to dlatego, że ostateczna / zawsze połknięty i jest określona gdzie indziej lub spadnie pod „w zwykły przypadek” kwalifikacji. Albo /usr/// i /usr/////////// odsyła do szalenie różne podmioty ...

Powiązane problemy