무슨 일로 C 하셨습니까?

[C] 문자열 다루기::문자열 비교 본문

C - 이걸 굳이?/유틸리티

[C] 문자열 다루기::문자열 비교

OJJJ 2020. 9. 2. 20:57

string.h 헤더파일을 참조하여

 

strcmp() 함수를 사용하여 쉽게 문자열을 비교할 수 있다.

 

그러나 난 굳이 두 문자열을 비교하는 함수를 만들 것이다.


이름 없는 함수부터 만들고 시작하자

#define SAME 0
#define NOT_SAME 1

int f(char* StringA, char* StringB) {
    return NOT_SAME;
}

이번엔 뭔가 느낌있어보이게 상수도 사용해보도록 하자

 

문자열 비교는 어려울 것이 없다.

문자열 즉 문자 배열에서 각 문자가 일치하는지 확인하면 된다.

 

#define SAME 0
#define NOT_SAME 1

int f(char* StringA, char* StringB) {
	int LengthA = StringLength(StringA);
    int LengthB = StringLength(StringB);

    for (int i = 0; i < LengthA; i++) {
        if (StringA[i] != StringB[i])
            return NOT_SAME;
    }
    
    return SAME;  
}

단순히 쭉 비교해서 같은지 다른지만 체크해 주면 되겠다.

 

 

그런데 같은지 다른지 뿐만 아니라 두 문자열의 우위를 비교하고 싶을 수도 있다.

사실 후에 정렬을 만들게 되면 사전적으로 두 문자열을 비교할 일이 생길 것 같다.

#define COMPARE_SRC -1
#define COMPARE_SAME 0
#define COMPARE_DST 1

int f(char* StringA, char* StringB) {
    int LengthA = StringLength(StringA);
    int LengthB = StringLength(StringB);

    if (LengthA == 0) {
        if (LengthB == 0) return COMPARE_SAME;
        return STRING_SRC;
    }
    else if (LengthB == 0) return COMPARE_DST;

    int i = 0;
    while (1) {
        if (StringA[i] < StringB[i]) return COMPARE_SRC;
        else if (StringA[i] > StringB[i]) return COMPARE_DST;
        else if (StringA[i] == StringB[i] && StringA[i] == 0) return COMPARE_SAME;

        i++;
    }
}

그렇다면 일단 상수를 세가지 경우로 나눈 후 각 문자를 비교해서 상황에 맞게 비교하면 되겠다.

이때 COMPARE_SRC는 왼쪽 문자열이 더 작은경우, COMPARE_DST는 오른쪽 문자열이 더 작은경우를 의미한다.

(SRC는 source, DST는 destination을 의미한다.)

 

* 비교하는 문자는 ASCII 코드를 기준으로 비교하므로 대문자가 소문자 보다 더 크게 인식된다.

<ASCII CODE>

 

 

 

마지막으로 함수이름과 파라미터를 의미에 맞게 적절히 변경시켜주면 되겠다.

int StringCompare(char* Src, char* Dst) 

(Src -> Source, Dst -> Destination, Compare -> 비교하다)

 

이 함수가 정상 작동하는지는 직접 테스트해보길 바란다

Comments