2017-02-20 4 views
-1

Ich habe dieses Programm erstellt, das durch ein Computerverzeichnis (mit einer Adresse, d. H. C: \ Windows) sucht. Es speichert die Dateinamen in verknüpften Listen, die in einem 26-langen Array organisiert sind (jeder Slot für einen Buchstaben des Alphabets).Wo setze ich meine frei(); in meinem C-Programm?

Wenn ich das Programm starte, druckt es die Dateinamen von Ordnern in Bezug auf die Buchstaben, die ich eingegeben habe. Wenn ich es jedoch ein zweites Mal mache, druckt es die letzten Ausdrucke zusammen mit den neuen aus .

Zum Beispiel:
Directory-Adresse eingeben: C: \ Windows-
C: \ Windows-
Geben Sie Buchstaben suchen: sy
sy
Symbole
-System
System.ini
System32
Geben Sie Buchstaben durch suchen: ein
ein
addins
AppCompat
AppPatch
AppReadiness
AsCDProc.log
Symbole
-System
System.ini
System32
Eingabe von Buchstaben Suche nach:

Ich glaube mein freies(); ist am falschen Ort. Ich bin neu in C, also lerne ich immer noch, wie man Speicher richtig verteilt. Hätte jemand Vorschläge, die mir helfen, dieses Problem zu beheben?

Hier ist mein Code:

#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

Buchungstext als Bild-Links gesetzt ist einfach nur schlecht. –

+1

Off-Thema. Möglicherweise müssen Sie viel mehr lernen. Kompiliere aber mit allen Warnungen und Debug-Informationen: 'gcc -Wall -g'. Verwenden Sie den 'gdb' Debugger &' valgrind' –

+0

Ich habe gerade C-Lion heruntergeladen, damit ich es ausprobieren werde. Ich habe versucht, den Text als Text zu veröffentlichen, aber die Formatierung, die er verwendet, hat ihn extrem komisch aussehen lassen. –

Antwort

0

Nach jedem Knoten Druck Anruf free() drauf und jedes Array-Element zu 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

Ich befreie tatsächlich die Speicher, aber irgendwie stoppt die Schleife, die ich vorher hatte. Es sollte eine Schleife durchlaufen werden, bis ein leerer String eingegeben wurde. Ich werde immer noch damit herumspielen und sehen. Vielen Dank. –

Verwandte Themen