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/////////// будет относиться к дико разные сущности...