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?
+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 –