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