gpt4 book ai didi

c - 如何从 c 中的目录中仅获取 *.txt 文件名并将其写入 char ** 数组?

转载 作者:行者123 更新时间:2023-12-02 05:26:44 25 4
gpt4 key购买 nike

它是我之前问题的延伸:How can I get only txt files from directory in c? .现在我想将这些文件名(我真的不知道目录中有多少)保存到 char ** 数组。我想出了一个解决方案(某种程度上),但后来我意识到我需要的不是 char* 而是 char **(我知道,愚蠢的我 :])

无论如何,我使用这段代码遇到了段错误 [core dumped]:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <stdbool.h>

char* allocMemory(int n)
{
char *tab = (char *) malloc(n*sizeof(char));
return tab;
}

void freeMemory(char **tab, int n, int m)
{
int i=0;
for(i=0; i<m; i++)
free(tab[i]);
free(tab);
tab = NULL;
}

bool hasTxtExtension(char const *filename)
{
size_t len = strlen(filename);
return len > 4 && strcmp(filename + len - 4, ".txt") == 0;
}

char** getTxtFilenames(const char *dirname)
{
DIR *directory = NULL;
struct dirent *ent = NULL;
int fileCounter = 0;

char **txtFiles = allocMemory(1);
char **moreTxtFiles = allocMemory(1);

directory = opendir (dirname);
if(directory == NULL)
return NULL;
int i = 0;

while ((ent = readdir (directory)) != NULL)
{
if(hasTxtExtension(ent->d_name))
{
fileCounter ++;
moreTxtFiles = (char**) realloc (txtFiles, fileCounter * sizeof(char*));

if(moreTxtFiles[i] != NULL)
{
txtFiles = moreTxtFiles;
txtFiles[i] = allocMemory(strlen(ent->d_name));
txtFiles[i][fileCounter - 1] = ent->d_name;
}
else
{
freeMemory(txtFiles, 1, fileCounter);
return NULL;
}
}
i ++;
}

if(closedir(directory) < 0)
return NULL;

return txtFiles;
}

int main(int argc, char **argv)
{
char **txtFilenames = getTxtFilenames("dir");
if(txtFilenames == NULL)
return -1;
printf("%s\n", txtFilenames[0][1]);
return 0;
}

编辑:

我也试过这个:(注意我有点混淆了 C 中那些不可爱的字符数组,argh :/)

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <stdbool.h>

char* allocMemory(int n)
{
char *tab = (char *) malloc(n*sizeof(char));
return tab;
}

void freeMemory(char *tab)
{
free(tab);
tab = NULL;
}

bool hasTxtExtension(char const *filename)
{
size_t len = strlen(filename);
return len > 4 && strcmp(filename + len - 4, ".txt") == 0;
}

char* getTxtFilenames(const char *dirname)
{
DIR *directory = NULL;
struct dirent *ent = NULL;
int fileCounter = 0;

char *txtFiles = NULL;
char *moreTxtFiles = NULL;

directory = opendir (dirname);
if(directory == NULL)
return NULL;

while ((ent = readdir (directory)) != NULL)
{
if(hasTxtExtension(ent->d_name))
{
fileCounter ++;
moreTxtFiles = (char*) realloc (txtFiles, fileCounter * sizeof(char));

if(moreTxtFiles != NULL)
{
txtFiles = moreTxtFiles;
txtFiles[fileCounter - 1] = ent->d_name;
}
else
{
freeMemory(txtFiles);
return NULL;
}
}
}

if(closedir(directory) < 0)
return NULL;

return txtFiles;
}

int main(int argc, char **argv)
{
char **txtFilenames = getTxtFilenames("dir");
if(txtFilenames == NULL)
return -1;
printf("%s\n", txtFilenames[0]);
return 0;
}

最佳答案

  • txtFilenames[0][1]是字符,不是字符串。
  • txtFiles[i][fileCounter - 1]是一个字符,但是 ent->d_name是一个字符串。

我不明白你为什么使用两个索引( ifileCounter )。只需使用一个字符串数组。您还应该包括 <string.h> .

解决方案更简单:

#include <direct.h>
#include <stdlib.h>
#include <string.h>

char **f(const char *s)
{
char **p = NULL;
DIR *dir;
struct dirent *ent;
size_t i = 0;

dir = opendir(s);

while ((ent = readdir(dir)) != NULL) {
if (hasTxtExtension(ent->d_name)) {
p = realloc(p, (i + 1) * sizeof(char *));
p[i] = malloc(strlen(ent->d_name) + 1);
strcpy(p[i], ent->d_name);
++i;
}
}

closedir(dir);
return p;
}

以下是改进此代码的非详尽列表:

  • 处理重新分配错误:if realloc失败,内存泄漏。
  • 处理目录错误:特别是处理 s 的情况是错误的目录路径。
  • 优化重新分配(不要在每次迭代中使用 realloc)。

关于c - 如何从 c 中的目录中仅获取 *.txt 文件名并将其写入 char ** 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979089/

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