ここでマニュアルを引用:
関数 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?
だから..誰かがここで何が起こっているのか理解していますか?