【问题标题】:Listing all files in current directory to a String in C将当前目录中的所有文件列出到 C 中的字符串
【发布时间】:2014-10-13 20:05:27
【问题描述】:

好的,所以我正在尝试将当前目录目录的所有文件列出到 C 中的字符串。 当前目录下的文件有:

myftpclient.c、myftpclient.o、myftpserver.c、myftpserver.o

char * list(void) 
{
    DIR *dp; // directory var
    struct dirent *ep;
    char str[256] ;
    int n = 0 ;
    dp = opendir ("./");
    if (dp != NULL)
    {
        while ((ep = readdir (dp)))
        {
            int curLen = strlen((ep->d_name)) ;
            strncat(str, (ep->d_name), curLen) ;
            strncat(str, "\n", 1) ;
            n += curLen + 1 ;
        }
        str[n] = '\0' ;
        (void) closedir (dp);
    }
    else
        perror ("Couldn't open the directory");

    return str ;
}

这是我的呼唤:

char * str = malloc(256) ;
str = list() ;

我打印字符串时的输出是: B0

这甚至不接近正确。我究竟做错了什么?

【问题讨论】:

  • 其他程序是什么?像c,bash等?以及它根本不起作用,与其他程序什么?
  • 您必须考虑到这不是代码审查服务。请编辑您的问题,说明您用作输入的内容(目录中的内容)、作为输出的内容以及您认为可能存在的问题。如果你帮助别人帮助你,那么你很可能会得到一些好的答案。事实上,一个简单的函数包装器可能会让包括你自己在内的其他人很容易看到正在发生的事情。
  • 我编辑了我的问题以使其更加清晰。另一个程序也是一个 C 程序,但我不应该提到它,这无关紧要,我正在这个程序中测试结果。
  • 也许管道到另一个程序,嗯,所以你得到它到另一个程序还是没有?

标签: c string stdout


【解决方案1】:

我在您的代码中看到以下问题。

  1. 您正在创建一个由 char 组成的数组以仅包含 256 字符。当保存目录条目名称和换行符所需的字符数超过 256 时,您将遇到超出范围的内存访问。

  2. 您正在返回一个指向在本地范围内定义的数组的指针。从函数返回后,数组将无效。

  3. 您可以使用strcat 代替strncatstrncat 仅在您希望追加的字符数少于源中的字符数时才有用。

您可以通过以下方式解决这些问题:

  1. 使用mallocstr分配内存。

  2. 使用realloc 增加为每个目录条目分配的内存。

  3. 确保在调用函数中free 是从list() 返回的内存。

这是一个应该可以工作的版本。

char * list(void) 
{
    DIR *dp; // directory var
    struct dirent *ep;
    char* str = malloc(1);
    int n = 0 ;
    str[0] = '\0';
    dp = opendir ("./");
    if (dp != NULL)
    {
        while ((ep = readdir (dp)))
        {
            int curLen = strlen((ep->d_name)) ;
            n += curLen + 2 ; // One of the terminating null and the
                              // other for the newline.
            str = realloc(str, n);
            strcat(str, (ep->d_name)) ;
            strcat(str, "\n") ;
        }
        (void) closedir (dp);
    }
    else
        perror ("Couldn't open the directory");

    return str;
}

【讨论】:

  • 就是这样!感谢您对工作版本的非常详细的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2012-10-28
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多