Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[5575] Re: 간단한 설명과 나름대로 수정해보았습니다.
외랑 [] 1642 읽음    2006-01-25 13:19
배열을 조금 더 이해하셔야 겠습니다.
읽어들인 파일명을 배열로 저장하신다고 하셨는데, 문제는 읽어들인 파일명이 이미 char형의 배열이라는 겁니다.
비록 수행되기는 할 지라도, 메모리 상으로 에러의 소지를 다분히 가지고 있는 소스입니다.
먼저 파일명을 확장자와 분리 하시려고 name[3]이라는 배열을 쓰셨는데,
파일명이 8자라고 가정하면 (ex: 12345678.bmp)
name[i]에서 변수 i는 과연 몇 까지 증가 할까요? 네.. 8개 문자 즉 i는 7이됩니다.
그런데 선언은 3개만 가질 수 있는 형태이죠... 이게 처음으로 보여지는 문제입니다.

두번째는 파일명을 저장할 장소로, sortn[MAX] 를 char * 형으로 선언하셨습니다.
이는 sortn[n] 은 단순히 포인터값만 저장할 수 있는 배열입니다. 그러나 대입부분을 보시면
sortn[n] = name 이라고 쓰셨습니다. name은 파일명을 떼오는 크기와 위치가 고정된 공간입니다.
이는 n이 증가함에 따라 sortn[n]에 들어있는 값이 가르키는 곳은 name이 저장된 위치다.
즉, sortn[0]이나 sortn[1]이나 sortn[2]이나 ... n까지 동일한 위치만 가르키는 것이죠..
데이타로 살펴보면 더 쉽게 이해하실 수 있습니다. (주소만 대입될 뿐이지 내용은 복사되지 않는다는 것이죠)
예를 들어 name의 저장주소가 1000번지라고 했을때
n=0일때 sortn[0] = name  ---> 요문장은 sortn[0]은 1000 번지가 됩니다.
n=1일때 sortn[1] = name  ---> 요문장은 sortn[1]은 역시 1000 번지가 됩니다.
이해가 되시나요?
나름대로 조금 수정해 보았습니다. 참고하시길 바랍니다.

//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dir.h>

#define MAXCOUNT 20

void main(void)
{
    struct ffblk ffblk;
    int i, j, k, done, n=0;
    char name[MAXFILE];
    char sortn[MAXCOUNT][MAXFILE];  // MAXFILE은 dir.h에 정해져있는 파일명의 최고길이

    printf("디렉토리에 있는 *.bmp 형식의 리스트.\n");
    done = findfirst("*.bmp", &ffblk, 0);
    while(!done)
    {
        for (i=0, j=0; i<strlen(ffblk.ff_name); i++)
        {
            if(ffblk.ff_name[i] == '.')
            {
                name[j] = '\0'; break;
            }
            else name[j++] = ffblk.ff_name[i];
        }

        for(k=0; k<=j; k++) sortn[n][k] = name[k]; //name의 내용을 복사합니다.

        printf(" %s\n", sortn[n++]);  // 내용을 출력하고 인덱스를 증가시킵니다.

        done = findnext(&ffblk);     // 다음 파일을 찾습니다.
    }
    getch();   // 한문자를 받으면 종료합니다.(conio.h필요.. 윈도우라 결과볼려구요..^^*)
}
//---------------------------------------------------------------------------




왕초보 님이 쓰신 글 :
: 읽어들인 파일명을 배열로 저장하려고 합니다.
: #include <stdio.h>
: #include <stdlib.h>
: #include <dir.h>
: #define MAX 20
:
: void main(void)
: {
:     struct ffblk ffblk;
:     int done;
:     int i, j;
:     char name[3];
:     int n = 0;
:     char *sortn[MAX];
:
:     printf("디렉토리에 있는 *.bmp 형식의 리스트.\n");
:     done = findfirst("data\\img\\*.bmp", &ffblk, 0);
:     while (!done){
:         for (i = 0, j = 0; i < strlen(ffblk.ff_name); i++){
:             if (ffblk.ff_name[i] == '.'){
:                 name[j] = '\0';
:                 break;
:             }
:             else {
:                 name[j] = ffblk.ff_name[i];
:                 j++;
:             }
:         }
:        
:         sortn[n] = name;                     //----┐
:         n++;                                        //         |-이부분
:         printf("    %s\n", sortn[0]);    //-----┘
:         done = findnext(&ffblk);
:        
:        
:     }
: }
:
: sortn[n] = name; 이부분에서 배열로 저장해야하는데
: printf("    %s\n", sortn[0]); <-- 이렇게 해보면 첫번째 배열값(파일명)만 계속 출력되야하는데 디렉토리에 있는 파일들 전부 출력됩니다. 즉, 배열에 순서대로 들어가지 않고 파일명이 모두 sortn[0]배열에만 입력되는것 같습니다.
: 어디가 잘못된것이고 어떻게 고쳐야 하는지요..

+ -

관련 글 리스트
5574 배열로 추가하는 문제 왕초보 1653 2006/01/25
5575     Re: 간단한 설명과 나름대로 수정해보았습니다. 외랑 1642 2006/01/25
5576         Re:Re: 고맙습니다. -내용無- 왕초보 1535 2006/01/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.