감사합니다
아 그렇게 되는 것이었군요;;
저는 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 이 전혀 바뀌지 않는 그런 현상이 생깁니다...