컴퓨터의 디렉토리 (주소 : C : \ Windows)를 검색하는 프로그램을 만들었습니다. 파일 이름을 26 길이의 배열 (알파벳 글자의 각 슬롯)로 구성된 링크 된 목록에 저장합니다.내 무료() 설정 위치; 내 C 프로그램에서?
내가 프로그램을 실행할 때 입력 한 글자를 기준으로 폴더의 파일 이름을 인쇄합니다. 그러나 두 번째로 할 때 마지막 인쇄물을 새로운 파일과 함께 다시 인쇄합니다 . 예를 들어
:
디렉토리 주소 입력 : C : \ WINDOWS
는 C : \ WINDOWS
에 의해 검색 할 문자를 입력 :
싸이
기호
시스템 한건데
System.ini
System32
에 의해 검색 할 문자를 입력 : 가
애드가
이 APPCOMPAT
AppPatch에
AppReadiness
AsCDProc.log
기호
시스템
을 System.ini
SYSTEM32
문자를 입력 검색 기준 :
나는 내 free()를 믿는다; 잘못된 위치에 있습니다. 나는 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' 디버거와'valgrind'를 사용하십시오 –
C-Lion을 다운로드 했으니까요. 텍스트를 텍스트로 게시하려고 시도했지만 사용중인 서식이 매우 이상하게 보였습니다. –