gpt4 book ai didi

c - minix 3.1 中的搜索功能

转载 作者:行者123 更新时间:2023-11-30 17:08:32 28 4
gpt4 key购买 nike

我一直在尝试在 minix 中实现一个搜索功能,它将在当前或子目录中查找文件并打印路径。到目前为止,我的代码编译成功,但由于某种原因只返回几个奇怪的 ASCII 字符,知道我做错了什么吗?

#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(char *find_file, (char *name, char *directory));

int main(argc, argv)
int argc;
char **argv;
{
char *path = find_file(argv[0], "./");
if (strcmp(path, "") == 0) {
printf("file could not be found.");
} else {
printf("File found in: %s\n", path);
}
return(0);
}

char *find_file(name, directory)
char *name;
char *directory;
{
DIR *d;
struct dirent *e;
struct stat s;

char *dr;
char *res;
char *result;

d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
if (e->d_name == name)
return name;
}
}
closedir(d);

d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
stat(e->d_name, &s);
if (s.st_mode & S_IFDIR) {
dr = malloc(strlen(directory) + strlen(e->d_name) + 2);
strcpy(dr, directory);
strcat(dr, e->d_name);
strcat(dr, "/");
res = find_file(name, dr));
if (strcmp(res, "") != 0) {
strcpy(result, e->d_name);
strcat(result, "/");
strcat(result, res);
return result;
}
}
}
}
closedir(d);
return "";
}

因此,我首先检查文件是否位于当前目录中,然后再进入子文件夹,这就是我打开和关闭目录两次的原因。我怀疑唯一可能不正统的事情是直接使用 malloc 并声明一个固定的数量,这是不行吗?感谢您的帮助<3

编辑:所以我尝试使用 malloc 与字符串的大小而不是设置的数量,但没有变化,这是一个屏幕截图:

enter image description here

EDIT2:根据建议更新了我的代码,但仍然无法 100% 工作,因为它正在父文件夹或类似的奇怪的东西,如果我设法让它完美工作,将发布解决方案 (y)

EDIT3:我已经设法让它工作(在某种程度上)它可以完美工作,但在某些情况下它找不到现有文件,不知道其原因,并且太累了以确定原因^ _^ 这是最终的工作代码,供将来寻找类似解决方案的其他人使用:

#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(char *find_file, (char *name, char *directory));

int main(argc, argv)
int argc;
char **argv;
{
char *path = find_file(argv[1], "./");
if (strcmp(path, "") == 0) {
printf("file could not be found.\n");
} else {
printf("File found in: %s\n", path);
}
return(0);
}

char *find_file(name, directory)
char *name;
char *directory;
{
DIR *d;
struct dirent *e;
struct stat s;

char *dr;
char *res;
char *result;

d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
if (strcmp(e->d_name, name) == 0)
return e->d_name;
}
}
closedir(d);

d = opendir(directory);
if (d != NULL) {
while (e = readdir(d)) {
stat(e->d_name, &s);
if (strcmp(e->d_name, ".") != 0 && strcmp(e->d_name, "..") != 0) {
if (s.st_mode & S_IFDIR) != 0) {
dr = malloc(strlen(directory) + strlen(e->d_name) + 2);
strcpy(dr, directory);
strcat(dr, e->d_name);
strcat(dr, "/");
res = find_file(name, dr));
if (strcmp(res, "") != 0) {
result = malloc(strlen(e->d_name) + strlen(res) + 2);
strcpy(result, e->d_name);
strcat(result, "/");
strcat(result, res);
return result;
}
}
}
}
}
closedir(d);
return "";
}

出于某种原因,文件名在 argv 1 中传递不是 argv[0],这很奇怪,因为我实现了另一个通过 argv[0] 传递文件名的函数... Minix ¯|(ツ)

最佳答案

您正在向 stat 提供未初始化的指针.

struct stat *s
....
stat(e->d_name, s);

你应该做的是:

struct stat s
....
stat(e->d_name, &s);

另一个问题(除其他外)是这部分:

strcpy(res, find_file(name, dr));
if (res != "") {

你不能在C中像这样比较字符串,你必须使用strcmp(res, "") == 0,因为你在这里比较指针。它甚至可能在这种情况下工作(如果编译器重用静态字符串),但在一般情况下它不会。

关于c - minix 3.1 中的搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33605190/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com