我正在尝试遍历一个路径已经给出的目录,但是下面的程序没有进入目录并被卡在无限循环中。这段代码有什么问题:
void func(char path[]);
int main(int argc, char *argv)
{
char buf[255];
getcwd(buf,255);
func(buf);
}
void func(char path[])
{
DIR *dirp;
struct stat states;
struct dirent *direntp;
dirp=opendir(path);
chdir(path);
while((direntp=readdir(dirp))!=NULL)
{
if(S_ISDIR(states.st_mode))//true than returns zero
{
printf("%s\n",direntp->d_name);
}
else
if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,"..")))// if true retrns zero
{
continue;
}
else
{
func(direntp->d_name);
chdir("..");
}
}
}
答案 0 :(得分:1)
您要么缺少某些代码,要么问题是您从未填充/更新states
。
再看看这一行:
if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,"..")))
它永远不会评估为真值,因为这需要direntp->d_name
同时等于.
和..
(这根本不可能)。我想你想在这里检查一下&&
,这只会进入分支,以防你的目录名与这两个值相匹配。
答案 1 :(得分:0)
在这部分代码中,states
在使用之前未初始化:
struct stat states;
struct dirent *direntp;
dirp=opendir(path);
chdir(path);
while((direntp=readdir(dirp))!=NULL)
{
if(S_ISDIR(states.st_mode))//true than returns zero
我认为编译器也会对此发出警告,所以请在编译器中打开警告(-W -Wall
表示gcc),然后注意并修复警告。
答案 2 :(得分:0)
您可以检查该节点是否是没有辅助states
的目录。struct dirent
有一个名为d_type
的字段,而它带有DT_DIR
来测试它是否是。目录