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