cuốn sách gpt4 ai đã làm

Kiểm tra xem đường dẫn thư mục có kết thúc bằng ".", ".."

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 10:31:12 28 4
mua khóa gpt4 Nike

Mình có một vấn đề về lập trình mong mọi người giúp đỡ. Tôi đang cố gắng học lập trình C cho một nhiệm vụ công việc và tôi đã đặt cho mình một dự án nhỏ liên quan đến việc đọc cây tệp bao gồm tất cả các thư mục con để lấy thông tin về từng tệp.

Vấn đề tôi gặp phải là chương trình của tôi không bỏ qua các đường dẫn thư mục kết thúc bằng /. hoặc /.. Khi nó in tất cả các thư mục, tôi muốn chừa khoảng trống trước các thư mục con để dễ đọc.

Vì vậy lỗi xảy ra ở phần này:

int isDir(const char *parent, char *name) {

struct stat st_buf; // thông tin tệp
char buf[BUF_SIZE];

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
return 0;
}
char *path = malloc(strlen(name) + strlen(parent) + 2);
//sprintf(char *buf, const char *format, [arg1],[arg2],...)
sprintf(path, "%s/%s", cha, name);
stat(đường dẫn, &st_buf); //

trả về S_ISDIR(st_buf.st_mode); //thư mục
}

Dưới đây là chức năng chính và chức năng danh sách:

danh sách int(const char *name) {
TRỰC TIẾP *dirp = opendir(tên);
struct dirent *nha khoa;
char buf[BUF_SIZE];

while ((dentry = readdir(dirp)) != NULL) {
char *dir_name = nha khoa->d_name;

printf(" %s\n", dir_name);

//nếu là dir thì vào dir
if (isDir(name, dir_name)) { //name : cha, dir_name : con
chdir(dir_name);
getcwd(buf, BUF_SIZE);
danh sách(buf);
}
}
closeir(dirp);
}

int main()
{
danh sách(".");
return 0;
}

Kết quả là thế này:

hm1.c
dữ liệu
lab1.txt
kết quả1
lab3.txt
.
..
.
..
kết quả2
lab3.txt
.
..
kết quả3
lab3.txt
.
..
ac
.
..
a.out

Tôi muốn in kết quả

hm1.c
dữ liệu
lab1.txt
kết quả1
lab3.txt
kết quả2
lab3.txt
kết quả3
lab3.txt
ac
a.out

câu trả lời hay nhất

nếu bạn có . ôi ..,của bạn isDir Trả về đúng/sai, trả về sai (hoặc 0), rồi đúng/khác S_ISDIR giá trị sai

Điều bạn thực sự cần là một hàm trả về một trong ba giá trị: SKIP, isFILE hoặc isDIR, sau đó viết logic in của bạn dựa trên đó.

Bạn cũng cần sửa lỗi rò rỉ bộ nhớ

Cũng xin lưu ý rằngchdir(dir_name); sẽ thay đổi thư mục thực tế của quy trình, vì vậy khi bạn ở trong vòng lặp từdanh sách Quay lại và bạn sẽ không thể mở tệp hoặc thư mục mà bạn đang lặp lại (vì hiện tại bạn đang ở trong một thư mục khác)

Điều này sẽ giải quyết vấn đề của bạn và in định dạng bạn muốn

enum { doSkip, isFile, isDir } testDir(char *path, char *name) 
{
chỉ số cấu trúc st_buf;
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
trả về doSkip;
}
stat(đường dẫn, &st_buf);
nếu (S_ISDIR(st_buf.st_mode))
trả về isDir;
trả về isFile;
}

danh sách void(const char *path, int indentlevel)
{
TRỰC TIẾP *dirp = opendir(path);
struct dirent *nha khoa;
char buf[10000]; // Hãy tạo bộ đệm đủ lớn cho ví dụ này
nếu (! dirp) {
printf("%*sNo access\n",indentlevel,"");
return;
}

while ((dentry = readdir(dirp)) != NULL) {

sprintf(buf,"%s/%s", path, dentry->d_name);
switch (testDir(buf,dentry->d_name)) {
trường hợp doSkip:
/*không làm gì cả*/
phá vỡ;
trường hợp làDir:
printf("%*s%s:\n",indentlevel,"",dentry->d_name);
danh sách(buf,indentlevel+4);
phá vỡ;
trường hợp isFile:
printf("%*s%s\n",indentlevel,"",dentry->d_name);
phá vỡ;
}
}
closeir(dirp);
}

int main()
{
danh sách(".", 0);
return 0;
}

Về việc kiểm tra xem đường dẫn thư mục có kết thúc bằng ".", ".." hay không, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/39809879/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress