Citando the manual qui:dirname() in C: il manuale è sbagliato?
Il dirname funzioni() e basename() rompere una stringa percorso terminazione Null in componenti directory e il nome. Nel solito caso , dirname() restituisce la stringa fino a, ma non inclusa, l'ultima '/' e basename() restituisce il componente dopo l'ultimo '/'. I caratteri "/" finali non vengono conteggiati come parte del nome del percorso.
E più tardi, avete questo tavolino:
path dirname basename
"/usr/lib" "/usr" "lib"
"/usr/" "/" "usr" // wat?
"usr" "." "usr"
"/" "/" "/"
"." "." "."
".." "." ".."
Perché dirname("/usr/")
tornando "/"
e non "/usr"
?
La frase nel manuale indica che dovrei ottenere /usr
come risultato.
Ho testato il risultato effettivo in un programma fittizio e si comporta come nel manuale.
#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'
Ora, quello che mi sarei aspettato sarebbe:
path dirname basename
"/usr/" "/usr" "" // more consistent?
Quindi .. nessuno capisce quello che sta succedendo qui?
+1 hai ottenuto il punto chiave e lo hai citato. A proposito, c'è anche un'interpretazione di Austin Group per un problema correlato # 612: http://austingroupbugs.net/view.php?id=612 –