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

C/C++ Q/A
[5576] Re:Re: 고맙습니다. -내용無-
왕초보 [] 1633 읽음    2006-01-25 15:14
외랑 님이 쓰신 글 :
: 배열을 조금 더 이해하셔야 겠습니다.
: 읽어들인 파일명을 배열로 저장하신다고 하셨는데, 문제는 읽어들인 파일명이 이미 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 배열로 추가하는 문제 왕초보 1752 2006/01/25
5575     Re: 간단한 설명과 나름대로 수정해보았습니다. 외랑 1731 2006/01/25
5576         Re:Re: 고맙습니다. -내용無- 왕초보 1633 2006/01/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.