1

私はcで反復dirを書き込もうとしてきました。私は標準の再帰的なディレクトリトラバーサルから始めました。これは期待どおりに機能します。現在、キュー構造を使用してこれを反復バージョンに変換しようとしていますが、予期しない動作をしています。どういうわけか、サブディレクトリ内のファイルがキューに追加されており、ファイルをディレクトリとして開こうとすると、プログラムが明らかに失敗します。

コードスニペット

char *dirName;
DIR *dp;
struct dirent *d_ent;
struct stat s;
char name[80];

...

while(!IsEmpty(q)){
    dirName = FrontAndDequeue(q);
    if((dp = opendir(dirName)) == NULL) {
        printf("ERROR: dirRec: %s: %s\n", dirName, strerror(errno));
    } else {
        while((d_ent = readdir(dp)) != NULL) {
            if((strcmp(d_ent->d_name, "..") != 0) && (strcmp(d_ent->d_name, ".") != 0)){
                strcpy(name, dirName);
                strcat(name, "/");
                strcat(name, d_ent->d_name);
                if(lstat(name, &s) < 0) {
                    printf("ERROR: dirDepth: %s: %s\n", name, strerror(errno));
                } else {
                    if(S_ISDIR(s.st_mode)) {      /* Process directories. */
                        printf("Directory : %s\n", name);
                        Enqueue(name, q);
                    } else {              /* Process non-directories. */
                        printf("File      : %s\n", name);
                    } 
                }
            }
        }
        closedir(dp);

サンプル実行

$ ./dir .
File      : ./dir.c
File      : ./dir.cpp
File      : ./dir.exe
File      : ./dir.exe.stackdump
File      : ./dirRec.c
File      : ./dirRec.exe
File      : ./fatal.h
File      : ./Makefile
File      : ./queue.c
File      : ./queue.h
File      : ./stackli.c
File      : ./stackli.h
Directory : ./testL1a
Directory : ./testL1b
File      : ./testL1b/New Bitmap Image.bmp
ERROR: dirRec: ./testL1b/New Bitmap Image.bmp: Not a directory
4

1 に答える 1

2

Enqueue()が何をするかはわかりませんが、文字列のコピーではなく、文字列へのポインタをキューに置く可能性が高くなります。そうです、whileループで名前を変更し続けるので、デキューするものが再び同じ文字列になることはありません。

于 2012-04-06T18:51:44.813 に答える