C中的dirname():是手动错了吗?

Gui*_*i13 6 c dirname

这里引用手册:

函数dirname()和basename()将以null结尾的路径名字符串分解为目录和文件名组件.在通常情况下,dirname()返回字符串,但不包括最后的'/',basename()返回最后的'/'后面的组件.尾随'/'字符不计入路径名的一部分.

后来,你有这个小桌子:

path         dirname    basename
"/usr/lib"    "/usr"    "lib"
"/usr/"       "/"       "usr"        // wat?
"usr"         "."       "usr"
"/"           "/"       "/"
"."           "."       "."
".."          "."       ".."
Run Code Online (Sandbox Code Playgroud)

为什么要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'
Run Code Online (Sandbox Code Playgroud)

现在,我期望的是:

path         dirname    basename
"/usr/"       "/usr"       ""        // more consistent?
Run Code Online (Sandbox Code Playgroud)

那么......有谁知道这里发生了什么?

chi*_*ill 14

尾随'/'字符不计入路径名的一部分.

因此"/ usr /"与"/ usr"相同,后者可能表示目录中的文件或名称(目录条目名称)usr的目录/.该函数dirname返回路径的父目录.父目录/usr/.似乎完全一致.