Почему моя программа не отображает вывод? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь рекурсивно пройти по каталогу и перечислить любые файлы, заканчивающиеся на .txt или имена папок.

void listFilesRecursively(char *basePath) {

    char path[1000];
    struct dirent *ptr;
    DIR *dir = opendir(basePath);

    // Unable to open directory
    if (!dir)
        return;

    while ((ptr = readdir(dir)) != NULL) 
    {
        if (strcmp(ptr->d_name,".") != 0 && strcmp(ptr->d_name, "..") != 0)
        {

            char *name = NULL;
            char *type = NULL;

            while (name != "." || name != NULL) {
                name++;
            }

            for (name = ptr->d_name; *name != '\0' ; name++) {

                if (name == '.') {
                    while (*name != '\0') {
                        *type = *name;
                        name++;
                    }
                        break;                      

                } else if (*name == '\0') {
                    printf("%s\n", ptr->d_name);
                }

            }                   

            if (strcmp(type,"txt") == 0)            
                printf("%s\n", ptr->d_name);

            // create new path from our base path
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, ptr->d_name);

            listFilesRecursively(path);

        }
    }
        closedir(dir);
}

Мои ожидаемые результаты будут файлы, которые заканчиваются в .txt и файлы, которые являются папками. Тем не менее, выходные данные пустые и могут войти в бесконечный цикл.

1 Ответ

0 голосов
/ 28 марта 2019

Это бесконечный цикл:

        while (name != "." || name != NULL) {
            name++;
        }

name - это char*. Если встроенный строковый литерал "." не хранится по адресу NULL (это не так), то вы говорите, что цикл должен продолжаться вечно, потому что name всегда будет либо не указывать на хранилище для "." или не указывает на NULL. Хотя я считаю, что официально сравнивать несвязанные указатели, такие как "." и name, официально не определено, на практике большинство (все модели с плоской памятью?) Просто допускают произвольные сравнения указателей, и, поскольку вы никогда не разыменовываете указатель, вы на самом деле никогда не пытаетесь читать нераспределенные адреса, которые вы пересекаете (вы, в конечном счете, можете сделать ошибку по умолчанию), так что это будет продолжаться вечно.

Мне неясно, какова цель этого цикла (может быть, отстранить ведущие . s от "скрытых" имен файлов?), Поэтому я не могу действительно предложить исправление, кроме удаления его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...