【问题标题】:how to add file names to a comma seperated string如何将文件名添加到逗号分隔的字符串
【发布时间】:2017-09-14 08:48:48
【问题描述】:

我正在使用下面的代码列出目录中的文件。如何将文件名添加到逗号分隔的字符串中?

#include <dirent.h> 
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>

int main(void)
{
  DIR           *d;
  struct dirent *dir;
  d = opendir("/home/test/filename_test");
  char *start = "";
  char *filename_list = strdup(start);

  if (d)
  {
    while ((dir = readdir(d)) != NULL)
    {
      int size = sizeof(dir->d_name);

      printf("%s\n", dir->d_name);

      printf("size of name is %d\n",size); 
    }

    closedir(d);
  }

  return(0);
}

【问题讨论】:

  • 分配一个缓冲区,使用sprintf()...有什么问题?
  • 您真的想将其创建为字符串吗?还是只想在控制台上显示,用逗号隔开?

标签: c arrays string


【解决方案1】:

一种简单的方法是

  • 在循环之前使用 strdup("") 分配一个零字符、以 null 结尾的 char*

  • 在每次迭代中增加它的大小。您可以使用 realloc() 来执行此操作,这将保留现有内容,并为添加更多内容腾出空间。您可以通过将旧长度、文件名长度、逗号长度和最后 0 的长度相加来计算出新缓冲区的长度。

  • 使用 strcat() 将文件名等附加到缓冲区。

您需要一些逻辑来避免将逗号放在列表末尾,它后面没有文件名。

这种方法的问题在于,由于重复重新分配,它在某些系统中可能效率低下。更好的方法是使用一个缓冲区,在迭代时以块的形式调整其大小。但是,如果您要这样做,使用 C 已经存在的众多字符串处理库之一可能会更容易。

【讨论】:

  • 嗨,凯文,我正在尝试实施您的建议。在上面的代码中,文件名的大小显示为 256。在取消引用指向结构的指针时可以使用运算符的大小吗?谢谢
  • 对不起,如果我遗漏了什么,但我不确定你为什么需要结构的大小。在您提供的代码示例中,我看不出有任何必要这样做。 sizeof() 应用于 any 指针将为您提供指针占用的内存量——这有时很有用,但我不明白您为什么在这里需要它。我认为最好发布一些代码供人们查看。
  • 嗨凯文,我的错误,我在dir-&gt;d_name 上使用了sizeof(),但正如您指出的返回指针占用的内存量。我之所以想这样做是因为我需要将大小传递给realloc(),但事后看来我需要传递dir-&gt;d_name 中的字符数加上其他项目的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-08-31
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多