Я создал эту программу, которая ищет в каталоге компьютера (с учетом адреса, то есть 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);
}
оприходования текст ссылки на изображения просто плохо. –
Вне темы. Возможно, вам придется многому научиться *. Но скомпилируйте все предупреждения и отладочную информацию: 'gcc -Wall -g'. Используйте 'gdb' debugger и' valgrind' –
Я только что загрузил C-Lion, чтобы попробовать. Я попытался опубликовать текст в виде текста, но форматирование, которое использует, делает его очень необычным. –