在这里引用手册:
函数 dirname() 和 basename() 将一个以 null 结尾的路径名字符串分解为目录和文件名组件。在通常情况下,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?
所以..有人明白这里发生了什么吗?