gpt4 book ai didi

将文件与路径连接起来以在 C 中获取完整路径

转载 作者:IT王子 更新时间:2023-10-29 00:56:55 26 4
gpt4 key购买 nike

使用 C,我试图将目录中的文件名与其路径连接起来,以便我可以为每个文件名调用 stat(),但是当我尝试在循环中使用 strcat 时,它将前一个文件名与下一个文件名连接起来.它在循环期间修改 argv[1],但我很长时间没有使用 C,所以我很困惑......

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

int main(int argc, char *argv[]) {
struct stat buff;

int status;

if (argc > 1) {
status = stat(argv[1], &buff);
if (status != -1) {
if (S_ISDIR(buff.st_mode)) {
DIR *dp = opendir(argv[1]);
struct dirent *ep;
char* path = argv[1];
printf("Path = %s\n", path);

if (dp != NULL) {
while (ep = readdir(dp)) {
char* fullpath = strcat(path, ep->d_name);
printf("Full Path = %s\n", fullpath);
}
(void) closedir(dp);
} else {
perror("Couldn't open the directory");
}
}

} else {
perror(argv[1]);
exit(1);
}
} else {
perror(argv[0]]);
exit(1);
}

return 0;
}

最佳答案

你不应该修改 argv[i]。即使这样做,您也只有一个 argv[1],因此对其执行 strcat() 将继续附加到您之前在其中拥有的任何内容。

你还有另一个微妙的错误。在大多数系统上,目录名和其中的文件名应由路径分隔符 / 分隔。您不会在代码中添加它。

要解决此问题,请在 while 循环之外:

size_t arglen = strlen(argv[1]);

您应该在 while 循环中执行此操作:

/* + 2 because of the '/' and the terminating 0 */
char *fullpath = malloc(arglen + strlen(ep->d_name) + 2);
if (fullpath == NULL) { /* deal with error and exit */ }
sprintf(fullpath, "%s/%s", path, ep->d_name);
/* use fullpath */
free(fullpath);

关于将文件与路径连接起来以在 C 中获取完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2153715/

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