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
[60548] Re:Re:char 질문입니다...
한수동 [hsd1987] 852 읽음    2010-03-22 14:52
감사합니다
아 그렇게 되는 것이었군요;;
저는 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 질문입니다... 한수동 965 2010/03/22
60547     Re:char 질문입니다... 장성호 835 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.