Trích dẫn the manual đây:dirname() trong C: là hướng dẫn sử dụng sai?
Các chức năng dirname() và basename() phá vỡ một chuỗi tên đường dẫn null-chấm dứt vào thư mục và tên file thành phần. Trong trường hợp thông thường, dirname() trả về chuỗi tối đa, nhưng không bao gồm, số '/' cuối cùng và tên cơ sở() trả về thành phần sau '/' cuối cùng. Trailing '/' các ký tự không được tính là một phần của tên đường dẫn.
Và sau này, bạn có bảng nhỏ này:
path dirname basename
"/usr/lib" "/usr" "lib"
"/usr/" "/" "usr" // wat?
"usr" "." "usr"
"/" "/" "/"
"." "." "."
".." "." ".."
Tại sao dirname("/usr/")
trở "/"
và không "/usr"
?
Câu trong sách hướng dẫn cho tôi biết tôi sẽ nhận được /usr
.
Tôi đã thử nghiệm kết quả thực tế trong một chương trình giả và nó hoạt động giống như hướng dẫn nói.
#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'
Bây giờ, những gì tôi mong chờ sẽ là:
path dirname basename
"/usr/" "/usr" "" // more consistent?
Vì vậy .. ai hiểu chuyện gì đang xảy ra ở đây?
+1 bạn có điểm chính và trích dẫn nó. FYI cũng có một diễn giải của Nhóm Austin cho một vấn đề liên quan # 612: http://austingroupbugs.net/view.php?id=612 –