2017-01-31 1 views
0

아래 코드를 사용하면 폴더 경로를 입력으로 사용할 때 문제가 있습니다 (" pack ") 경로를 폴더 또는 하위 폴더에서 문자열 배열로 찾을 수있는 각 .wav 파일에 배치합니다.C - 폴더 및 하위 폴더의 모든 wav 파일 경로를 재귀 함수를 사용하여 문자열 배열로 변환

아래에서 볼 수있는 코드가 다운됩니다.

너희들을 요청하기 전에 나 자신으로 검색을했습니다와 내가 함께 테스트하고있어 해당 폴더

폴더 구조의 첫 번째 파일에 대한 realloc 함수하려고 할 때 충돌이 두 번째 하위 폴더에있는 동안을 추가 할 것으로 보인다 도움 이렇게되면 :

pack 
├── _subfolder1 
| ├── wavefile1.wav 
| ├── wavefile2.wav 
| └── wavefile3.wav 
├── _subfolder2 
| └── wavefile4.wav 
├── _subfolder3 
| ├── wavefile5.wav 
| └── wavefile6.wav 

코드 :

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

void find_dir_content(char* path, char** filepathlist, int* size) 
{ 

    DIR* d = opendir(path); 
    if(d == NULL) 
     return; 
    struct dirent* dir; 

    while((dir = readdir(d)) != NULL) 
    { 
     int isdir = 0; 
     DIR* tmp; 
     char f_path[255]; 
     sprintf(f_path, "%s/%s", path, dir->d_name); 
     if((tmp = opendir(f_path))) { 
      closedir(tmp); 
      isdir = 1; 
     } 

     if(!isdir) { 

      char *dot = strrchr(dir->d_name, '.'); 
      if (dot && !strcmp(dot, ".wav")){ 
       char** tmp = realloc(filepathlist, sizeof(char*) * ((*size) + 1)); 
       if (tmp == NULL) 
       { 
        return; 
       } 
       else 
       { 
        filepathlist = tmp; 
       } 
       char d_path[256]; 
       sprintf(d_path, "%s/%s", path, dir->d_name); 
       filepathlist[*size] = d_path; 
       //printf("%d : %s\n", *size, filepathlist[*size]); 
       (*size)++; 

      } 
     } 
     else if(isdir && strcmp(dir->d_name, ".") != 0 && 
      strcmp(dir->d_name, "..") != 0) 
     { 
      char d_path[256]; 
      sprintf(d_path, "%s/%s", path, dir->d_name); 
      //printf("%s\n", d_path); 
      find_dir_content(d_path, filepathlist, size); 


     } 
    } 
    closedir(d); 

} 

int main(int argc, char** argv) 
{ 
    int sizefilepathlist = 0; 
    char** filepathlist = (char**) malloc(0*sizeof(char*)); 
    find_dir_content("pack", filepathlist, &sizefilepathlist); 
    for(int i = 0; i< sizefilepathlist; i++){ 
     printf("%s", filepathlist[i]); 
    } 

    return 0; 
} 

편집 : 내가는 MinGW (GCC)와 codelite를 사용, 창문에있어, 어떤 오류 메시지가없는, 창문 그냥 제공 나 옛날 "작동을 멈췄다"오류.

+0

또한 버전 및 플랫폼에 대한 오류 메시지와 몇 가지 세부 사항을 제공하십시오! – jkalden

+2

로컬 변수의 주소를 저장하고 있습니다. 그러면 정의되지 않은 동작이 발생합니다. 경로에 대한 포인터가 아니라 경로 자체에 대한 공간을 동적으로 할당해야합니다. 'strdup()'를 사용한다면, 그것을 다시 구현해야한다. – unwind

+0

BTW, 숙제가 아니라면 "파일 트리 워크"(https://linux.die.net/man/3/ftw)를 선택하거나 고급 언어/라이브러리를 사용할 수도 있습니다 – Igor

답변

0

으로는 코멘트에 @unwind 지적 : 당신은 지역 변수의 주소를 저장하고

. 그러면 정의되지 않은 동작이 발생합니다. 경로에 대한 포인터가 아니라 경로 자체에 대한 공간을 동적으로 할당해야합니다.

작은 변화는 줄을 변경하는 것입니다 :

  filepathlist[*size] = d_path; 

  filepathlist[*size] = strdup(d_path); // d_path will go out of scope - copy the string to dynamically allocated memory. 

당신이 #include <string.h>strdup의 프로토 타입을 얻을 수 있는지 확인합니다.

편집 :

또 다른 문제가 있음을 main의 변수는 여전히 이전 위치를 가리키는 때 realloc(filepathlist). 이 find_dir_contentfilepathlist의 현재 위치를 반환 할 수 있도록함으로써 해결할 수 있습니다 :

char **filepathlist(...) { 
    ... 
    return filepathlist; 
} 

메인에 :

filepathlist = find_dir_content("pack", filepathlist, &sizefilepathlist); 
+0

답변 해 주셔서 감사합니다. @unwind가 문제의 일부를 해결했지만 오류가 여전히 여기에 있습니다. – halcaponey

+0

@halcaponey 다른 버그 수정 –

+0

을 추가했습니다. 정말 고마워요. – halcaponey

관련 문제