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

C++빌더 Q&A
C++Builder Programming Q&A
[60547] Re:char 질문입니다...
장성호 [nasilso] 834 읽음    2010-03-22 14:41
[문제점]
EraseChr 함수에서
님께서 이상하다고 생각하시는 부분을 풀어서 코딩해보세요


//다음 코드를 풀어서 코딩하면...
Str[s] = Str[++s];                 //***************

//다음과 같이 되지 않겠습니까?
s++;
Str[s] = Str[s];    //같은 위치값을 가지니 아무 의미 없는 코드가 되겠지요


++s를 반대로 해도 마찬가지 입니다.
//다음 코드를 풀어서 코딩하면...
Str[s] = Str[s++];                 

//다음과 같이 되겠지요
Str[s] = Str[s];  
s++;



윈본과 복사하는 위치가 같으니 아무 의미없는 코드가 됩니다.

[수정]
void EraseChr(char *Str, const char Erase)
{
    int i = 0;
    while(Str[i]!=NULL) {   i++;    }

    while(--i>=0)    {
        if(Str[i]==Erase)   {
            int s = i;
            while(1)
            {
            	s++;
                Str[s-1] = Str[s];//다음과 같이 원본과 copy할 위치가 달라야 겠지요!
                if(Str[s]==NULL)    break;
            }
        }
    }
}


[함수의 개선점 ]
그런데 위 코드를 자세히 보면 문제점(?)이 좀 있습니다.

   위 코드는..
   1) 먼저 문자열의 전체 길이를 판단한후
   2) 뒤에서 부터 Erase를 찾아서 찾으면 뒷쪽 전부를 한칸씩 앞당깁니다.
   3) 그렇게 맨앞까지 반복하지요


   문제점 
   1) "문자열"  스캔을 최소한 2번이상 반복합니다.
   2) 만약 문자열중에 Erase할 char가 5번 있으면  맨 뒷쪽에 문자는 5번이나 이동하게 됩니다.
       네번째 Erase - Char뒷쪽에 문자열을 최소 4번이상 이동하게 되죠...
     
      만약 Erase할 char가 굉장히 많다면  속도가 굉장히 많이 느려질것입니다.


[개선 함수]   
   다음과 같이 하면
   * 앞쪽에서 부터 한번만 scan하고..
   * Erase-Char가 아무리 많아도 이동해야할 char는 딱 한번만 이동시킵니다.

void EraseChr2(char *Str, const char Erase)
{
    int i = 0;
    int iErasePos=0;
    while(Str[i])
    {
        if(Str[i]==Erase)iErasePos--;
        else if(i!=iErasePos)Str[iErasePos]=Str[i];
        i++;
        iErasePos++;
    }
   Str[iErasePos]=0;
}

 
그럼..
 
  
 








한수동 님이 쓰신 글 :
: char ... 항상 코딩할때 마다 태클을 거네요;;
:
:
: void EraseChr(char *Str, const char Erase)
: {
: 	int i = 0;
: 	while(Str[i]!=NULL)	{	i++;	}
: 
: 	while(--i>=0)	{
: 		if(Str[i]==Erase)	{
: 			int s = i;
: 			while(1)	{
: 				Str[s] = Str[++s];                 //***************
: 				if(Str[s]==NULL)	break;
: 			}
: 		}
: 	}
: }
: 

:
: 제가 하고자 하는 것은요 파라미터에서 Erase 캐릭터 를 Str 문자열에서 지우는 그런 함수입니다
: 이미 구현된 함수 인지는 모르겠지만요
:
: 제가 궁금한것은 주석으로 별표 친부분이 왜 안 먹히는지... 그것이 궁금합니다
:
: 결과를 보면 파라미터인 char *Str 이 전혀 바뀌지 않는 그런 현상이 생깁니다...

+ -

관련 글 리스트
60546 char 질문입니다... 한수동 965 2010/03/22
60547     Re:char 질문입니다... 장성호 834 2010/03/22
60548         Re:Re:char 질문입니다... 한수동 852 2010/03/22
60549             Re:Re:Re:char 질문입니다... 장성호 964 2010/03/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.