gpt4 book ai didi

c - 在C中将文件路径解析为可执行文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:54 25 4
gpt4 key购买 nike

我目前的任务是用 C 语言编写一个原始 shell,并且在实现构建给定请求程序路径的 shell 功能时遇到了困难。例如将 wc 的用户输入转换为 /usr/bin/wc

Getenv() 可以很好地获取 $PATH 的值。使用我的导师提供的代码,我还将这个值解析为单独的“ token ”,其中定义了一个 token :typedef char *tok_t

我的问题是如何修复以下函数的实现,如果找到则返回给定文件名的绝对路径,否则返回 NULL

这里的主要问题是连接 tok_tchar* 以生成完整路径名。

char *resolve_path(char *filename) {
printf("trying to resolve path...\n");
char *path_var = getenv("PATH");
tok_t *path_list = get_toks(path_var);
//fprint_tok(stdout, path_list);
char *path;
for (int i = 0; path_list[i]; i++) {
path = (char*) malloc(PATH_MAX);
strcat(path, *path_list[i]);
strcat(path, filename);
printf("Trying... %s\n", path);
if (file_exists(path)) {
return path;
}
free(path);
}
return NULL;
}

我应该为 malloc() 和 strcat() 而烦恼,还是有更好的实现方法?目前在使用 strcat() 时收到有关类型兼容性的段错误和警告。

最佳答案

您确实需要使用 malloc(),因为您要从函数返回结果路径(指向在此函数中创建的自动数组的指针在函数返回后将无效)。您确实需要使用 strcat() 或类似的方法来生成一个连续的 char * 以传递给 file_exists()

但是,您的代码存在一些问题:

  • 不要将 void * 显式转换为 C 中的其他类型 - 充其量,这是不必要的 ( I'm talking about casting the return value of your allocation, in this case )。
  • 检查 malloc() 是否失败。
  • 您不需要在循环内调用 malloc()free() - 在循环外(每个)一次就足够了。
  • 如果 tok_t 是一个 char * 那么 path_list 是一个 char **,所以不需要取消引用path_list[i] 当您将它传递给 strncpy()/strncat() 时,因为它只是一个 char,当他们期望字符串时。这可能是您声明“当前收到关于使用 strcat() 的类型兼容性的段错误和警告。”
  • 的可能原因
  • 在第一次调用 strcat() 之前,您需要将 path 的第一个字符设置为 NULL,或者更好,使用 strncpy(),在这种情况下,您需要在完成后将 path 的最后一个字符设置为 NULL。
  • strncat()PATH_MAX - strlen(path) 一起使用,否则您可能会溢出 path

这是一个例子:

char *resolve_path(const char *filename) {
printf("trying to resolve path...\n");
char *path_var = getenv("PATH");
tok_t *path_list = get_toks(path_var);
char *path = malloc(PATH_MAX+1); // See, no cast, and the +1 is for the NULL
if (!path) {
return NULL; // Check for failure
}
// strncpy/strncat won't null-terminate path if we run out of space
path[PATH_MAX] = NULL;
for (int i = 0; path_list[i]; i++) {
// this could be done more efficiently with memcpy/hand-coding/etc
strncpy(path, path_list[i], PATH_MAX); // don't dereference it
strncat(path, filename, PATH_MAX - strlen(path));
printf("Trying... %s\n", path);
if (file_exists(path)) {
return path;
}
}
free(path);
return NULL;
}

关于c - 在C中将文件路径解析为可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598793/

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