[문제점]
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 이 전혀 바뀌지 않는 그런 현상이 생깁니다...