1

パスが指定されているディレクトリをトラバースしようとしていますが、次のプログラムがディレクトリ内に移動せず、無限ループでスタックしています。このコードの問題は何ですか:

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("..");
        }
    }
}
4

3 に答える 3

1

いくつかのコードが欠落しているか、問題は、データを入力/更新しないという事実ですstates

また、この行をもう一度見てください。

if(!(strcmp(direntp->d_name,".")||strcmp(direntp->d_name,"..")))

direntp->d_nameが等しいと.同時に..同時に必要になるため、真の値に評価されることはありません(これは単純に不可能です)。ここで確認したかったと思います。&&ここでは、ディレクトリ名がいずれかの値と一致する場合にのみブランチが入力されます。

于 2012-12-13T08:45:26.370 に答える
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 -Wallgccの場合)で警告をオンにしてから、警告に注意して修正してください。

于 2012-12-13T08:56:01.987 に答える
0

ノードが補助のないディレクトリであるかどうかを確認できますstatesstruct direntと呼ばれるフィールドがありd_typeDT_DIRそれがディレクトリであるかどうかをテストします。

于 2012-12-13T09:35:35.577 に答える