1

我有一个函数可以读取单个输入目录中包含的所有文件。
我想让该函数不仅读取“主”目录中的文件,还读取所有子目录中包含的文件。

为此,我编写了以下代码:

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <stdio.h>

struct dirent *readdir(DIR *dirp);
char * percorso;
DIR *cartella;
struct dirent *elemento;



char * scrivi(char * a, char * b)
{

char *targetdir = malloc(2048);
strcpy(targetdir,a);
strcat(targetdir,"/");
strcat(targetdir,b);

printf("%s \n", targetdir); 
return targetdir;
}    

void scorriFolder(char* nome)
{
if ((cartella = opendir(nome)) == NULL)         
    perror("opendir() error");                      
else {
    printf("contents of root: \n");
    while ((elemento = readdir(cartella)) != NULL)
    {                                               
        if(elemento->d_type == DT_DIR)
        {
            if(elemento->d_name != ".." || elemento->d_name != ".")
            {
                percorso = scrivi(nome, elemento->d_name);
                scorriFolder(percorso);
            }
        }
        else 
        {
            printf("  %s\n", elemento->d_name); 
        }
    }
    closedir(cartella);                         
}
}    

main(int argc, char * argv[]) {
scorriFolder(argv[1]);
} 

但它甚至没有编译,说:

warning: incompatible implicit declaration of built-in function ‘malloc’
warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strcat’

据我所知,这个问题是由于传递给malloc,strcpystrcat函数的变量格式错误造成的。(elemento->d_name有类型char而不是char*

为了使此代码正常工作,我该怎么做?

谢谢。

编辑

这是一个工作while片段:

while ((elemento = readdir(cartella)) != NULL)

{               
        if ( strcmp(elemento->d_name, ".")  == 0)
        {
            continue;
        }
        if ( strcmp(elemento->d_name, "..")  == 0)
        {
            continue;
        }
            if(elemento->d_type == DT_DIR)
            {

                {
                    percorso = scrivi(nome, elemento->d_name); 
                    scorriFolder(percorso);
                }
            }
            else 
            {
                printf("  %s\n", elemento->d_name); 
            }
        }

一旦它扫描一个子目录,它就会崩溃,因为当程序从子目录退出时它没有更新路径。我正在尝试修复它。

4

1 回答 1

5

您需要在文件的开头添加#include <stdlib.h>和。#include <string.h>

warning: incompatible implicit declaration of built-in function ‘malloc’

此错误消息告诉您编译器无法确定malloc. 我认为如果找不到返回类型,编译器会假定返回类型为 int。这不是void *malloc 实际返回的。

malloc 定义在<stdlib.h>

strcpy 和 strcat 定义在<string.h>

要找出这些函数的定义位置,您可以通过键入man mallocman strcpyman strcat

于 2013-05-07T20:54:36.320 回答