Unter Berufung auf the manual hier:dirname() in C: ist das Handbuch falsch?
Die Funktionen dirname() und Basisnamen() bricht einen nullterminierten Pfadnamen Zeichenfolge in dem Verzeichnis und die Dateinamen Komponenten. In der üblichen Fall, dirname() gibt die Zeichenfolge bis zu, aber nicht einschließlich der endgültigen '/', und basename() gibt die Komponente nach dem abschließenden '/' zurück. Nachgestellte '/' Zeichen werden nicht als Teil des Pfadnamens gezählt.
Und später, haben Sie diese kleine Tabelle:
path dirname basename
"/usr/lib" "/usr" "lib"
"/usr/" "/" "usr" // wat?
"usr" "." "usr"
"/" "/" "/"
"." "." "."
".." "." ".."
Warum dirname("/usr/")
kehrt "/"
und nicht "/usr"
?
Der Satz im Handbuch sagt mir, dass ich als Ergebnis /usr
bekommen sollte.
Ich testete das tatsächliche Ergebnis in einem Dummy-Programm und es verhält sich genau wie das Handbuch sagt. Jetzt
#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'
, was ich erwarten würde, wäre:
path dirname basename
"/usr/" "/usr" "" // more consistent?
Also .. jemand versteht, was hier vor sich geht?
+1 Sie haben den entscheidenden Punkt und zitierte es. Zu Ihrer Information gibt es auch eine Interpretation der Austin Group für eine verwandte Ausgabe # 612: http://austingroupbugs.net/view.php?id=612 –