dirname () в C: неправильно ли руководство?

со ссылкой на руководство здесь:

функции dirname () и basename() разбивают null-terminated строка пути в компоненты каталога и имени файла. В обычном кейс,dirname () возвращает строку до, но не включая, окончательный '/ ' , и basename() возвращает компонент после окончательного '/'. Завершающие символы ' / ' не учитываются как часть пути.

и потом, у вас есть этот столик:

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

почему dirname( "/usr/") возвращение "/", а не "/usr" ?
Предложение в руководстве говорит мне, что я должен получить /usr как результат.
Я проверил фактический результат в фиктивной программе, и он ведет себя так же, как говорится в руководстве.

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

теперь то, что я ожидал бы:

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

так.. кто-нибудь понимает, что здесь происходит?

2 ответов


завершающие символы '/' не учитываются как часть пути.

следовательно, " / usr/ "совпадает с" /usr", что может обозначать файл или каталог с именем (запись каталога с именем) usr в каталоге /. Функция dirname возвращает родительский каталог путь. Родительский каталог /usr is /. Похоже, все сходится.


каталог также является файлом. usr Это, конечно, базовое имя файла /usr. Это следует за руководством точно-в /usr, корневой/ - Это заключительный / и usr Это то, что следует за ним, следовательно, является базовым именем.

как /usr/ V /usr, Я подозреваю, что это потому, что final / всегда проглатывается, и это указывается где-то еще или подпадает под квалификацию "в обычном случае". Или же /usr/// и /usr/////////// будет относиться к дико разные сущности...