2017-02-20 55 views
-1

Я создал эту программу, которая ищет в каталоге компьютера (с учетом адреса, то есть C: \ Windows). Он хранит имена файлов в связанных списках, организованных в 26-длинном массиве (каждый слот для буквы алфавита).Где установить мой бесплатный(); в моей программе на C?

Когда я запускаю программу, он распечатывает имена файлов папок в соответствии с буквами, которые я набрал. Однако, когда я делаю это во второй раз, он распечатывает последние распечатки снова вместе с новыми ,

Например:
Введите адресный: C: \ Windows
C: \ Windows
Введите буквы для поиска по: синте
SY
Символы
системы
System.ini
System32
Введите буквы для поиска по: а
а
Addins
AppCompat
AppPatch
AppReadiness
AsCDProc.log
Символы
Система
System.ini
System32
Введите буквы для поиска по:

Я считаю, что мой свободный(); находится в неправильном месте. Я новичок в C, поэтому я все еще изучаю, как правильно распределять память. У кого-нибудь есть какие-то предложения, которые помогут мне исправить эту проблему?

Вот мой код:

#include <stdio.h> 
#include <string.h> 
#include <dirent.h> 
#include <stdlib.h> 

//Prototyping 
int fileNameBegin(const char *a, const char *b); 
void returner(char directory[256], char string[32]); 
void print(); 

//Array of Node Pointer 
struct node* arrayOfLinkedLists[26]; 

//Main 
int main() { 
    printf("Enter Directory Address:\n"); 
    char str[256]; 
    gets(str); 
    char letter[32]; 
    do { 
     printf("Enter letters to search by:\n"); 
     letter[0] = '\0'; 
     gets(letter); 
     returner(str, letter); 
     print(); 

    } while (letter[0] != '\0'); 
    return 0; 
} 

//Constructing the Node Struct 
struct node{ 
    char fileName[50]; 
    struct node *next; 
}; 

//Narrowing Down Search 
int fileNameBegin(const char *a, const char *b) 
{ 
    if(strncasecmp(a, b, strlen(b)) == 0) return 1; //not case sensitive, string comparing var a and b with String length 
    return 0; 
} 

#define DATA_MAX_LEN 50 

//Adding the node (Files) to the LinkedList in Array 
void addFileName(struct node **pNode, const char *c) 
{ 
    while (*pNode) 
     pNode = &(*pNode)->next; //It equals the address of the pointer 

    *pNode = malloc(sizeof **pNode); 

    strncpy((*pNode)->fileName,c,DATA_MAX_LEN-1); //Copying characters from String 
    (*pNode)->fileName[ DATA_MAX_LEN-1] = 0; 
    (*pNode)->next = NULL; 
} 

//Opening the Directory. Reading from Directory. Comparing File Name to String and Adding if there's a match 
void returner(char directory[256], char string[32]) 
{ 
    DIR *pDir = opendir (directory); 
    if (pDir) 
    { 
     struct dirent *pent; 
     while ((pent = readdir(pDir))) 
     { 
      if (pent->d_name[0] == '.' && (pent->d_name[1] == 0 || (pent->d_name[1] == '.' && pent->d_name[2] == 0))) 
       continue; 

      if(fileNameBegin(pent->d_name, string)) 
       addFileName(arrayOfLinkedLists + ((int) strlwr(string)[0] - 97), pent->d_name); 
     } 
     closedir (pDir); 
    } 
} 

//I have no idea what this does.... oh, it displays it, duh. 
void print(){ 
    int i; 
    struct node *temp; 

    for(i=0 ; i < 26; i++){ 
     temp = arrayOfLinkedLists[i]; 
     while(temp != NULL){ 
      printf("%s\n",temp->fileName); 
      temp = temp->next; 
     } 
    } 
    free(temp); 
} 
+3

оприходования текст ссылки на изображения просто плохо. –

+1

Вне темы. Возможно, вам придется многому научиться *. Но скомпилируйте все предупреждения и отладочную информацию: 'gcc -Wall -g'. Используйте 'gdb' debugger и' valgrind' –

+0

Я только что загрузил C-Lion, чтобы попробовать. Я попытался опубликовать текст в виде текста, но форматирование, которое использует, делает его очень необычным. –

ответ

0

После каждого узла печати вызова free() на нем и установить каждый элемент массива в NULL

void print(){ 
    int i; 
    struct node *temp,*printed; 

    for(i=0 ; i < 26; i++){ 
     temp = arrayOfLinkedLists[i]; 
     while(temp != NULL){ 
      printf("%s\n",temp->fileName); 
      printed = temp; 
      temp = temp->next; 
      free(printed); 
     } 
     arrayOfLinkedLists[i] = NULL; 
    } 
} 
+0

Я действительно освобождаю память, но как-то останавливает цикл, который у меня был раньше. Предполагалось, что цикл будет установлен до тех пор, пока не будет введена пустая строка. Я все еще собираюсь возиться с ним и видеть. Спасибо. –