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
[60549] Re:Re:Re:char 질문입니다...
장성호 [nasilso] 963 읽음    2010-03-22 15:05
[EraseChr3]
제가 수정한 EraseChr2 도 좀 문제점이 있네요

문제점
쓸데없이 iErasePos-- 했다가 다시 iErasePos++ 하고 있으니...


다음과 같이 한번더 살짝 수정했습니다.
void EraseChr3(char *Str, const char Erase)
{
    int i = 0;
    int iErasePos=0;
    while(Str[i])
    {
        if(Str[i]==Erase)
        {
         	i++;
            continue;
        }
        else if(iErasePos!=i)
        {
        	Str[iErasePos]=Str[i];
        }
        i++;
        iErasePos++;
    }
   Str[iErasePos]=0;
}


그럼..


한수동 님이 쓰신 글 :
: 감사합니다
: 아 그렇게 되는 것이었군요;;
: 저는 Str[s] = Str[++s]; 라고 하면
: 앞의 s 와 뒤의 s 값이 달라지는줄 알았습니다;
: 컴파일러가 ++계산을 먼저하고서 진행 하는군요;;
:
: 그리고 수정해주신 방법..
: 제 머리를 한대 탁 때리는 방법이군요;;
: 다시한번 감사드립니다
:
:
:
:
: 장성호 님이 쓰신 글 :
: : [문제점]
: : 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 질문입니다... 한수동 964 2010/03/22
60547     Re:char 질문입니다... 장성호 834 2010/03/22
60548         Re:Re:char 질문입니다... 한수동 852 2010/03/22
60549             Re:Re:Re:char 질문입니다... 장성호 963 2010/03/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.