2012-12-10 11 views
6

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?

risposta

14

caratteri finali '/' non sono conteggiati come parte del percorso.

Quindi "/ usr /" è lo stesso di "/ usr", che potrebbe indicare un file o una directory con nome (voce della rubrica denominata) usr nella directory /. La funzione dirname restituisce la directory padre del percorso. La directory principale di /usr è /. Sembra del tutto coerente.

+0

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

4

Una directory è anche un file. usr è ovviamente il nome di base del file /usr. Ciò segue esattamente il manuale - in /usr, la radice - / è la finale / e usr è ciò che la segue, quindi è il nome di base.

Come per /usr/ v. /usr, ho il sospetto che questo è perché la finale / è sempre inghiottito, come specificato da qualche altra parte o rientra nella "nel caso usuale" qualificazione. Oppure /usr/// e /usr/////////// sarebbe fare riferimento a soggetti molto diversi ...

Problemi correlati